Avoid a leak in expr's implementation of the ":" (match) operator.
authorJim Meyering <jim@meyering.net>
Thu, 11 Jan 2007 18:31:27 +0000 (19:31 +0100)
committerJim Meyering <jim@meyering.net>
Thu, 11 Jan 2007 18:31:27 +0000 (19:31 +0100)
* src/expr.c (docolon): Free the regexp buffer using regfree, rather
than doing it manually, being careful to set fastmap to NULL first.
Free any re_regs.start and .end members, if necessary.

ChangeLog
src/expr.c

index 6e4e9be..84bda39 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2007-01-11  Jim Meyering  <jim@meyering.net>
 
+       Avoid a leak in expr's implementation of the ":" (match) operator.
+       * src/expr.c (docolon): Free the regexp buffer using regfree, rather
+       than doing it manually, being careful to set fastmap to NULL first.
+       Free any re_regs.start and .end members, if necessary.
+
        * tests/misc/test-diag: Work also when libc's error function
        reports the entire program name ("../../src/test"), rather than
        just the final component.
index 7f9f532..352c80c 100644 (file)
@@ -427,6 +427,10 @@ docolon (VALUE *sv, VALUE *pv)
   tostring (sv);
   tostring (pv);
 
+  re_regs.num_regs = 0;
+  re_regs.start = NULL;
+  re_regs.end = NULL;
+
   re_buffer.buffer = NULL;
   re_buffer.allocated = 0;
   re_buffer.fastmap = fastmap;
@@ -463,7 +467,13 @@ docolon (VALUE *sv, VALUE *pv)
           (matchlen == -2 ? errno : EOVERFLOW),
           _("error in regular expression matcher"));
 
-  free (re_buffer.buffer);
+  if (0 < re_regs.num_regs)
+    {
+      free (re_regs.start);
+      free (re_regs.end);
+    }
+  re_buffer.fastmap = NULL;
+  regfree (&re_buffer);
   return v;
 }