summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2010-10-11 22:46:44 -0400
committerAndreas Schwab <schwab@redhat.com>2010-12-01 15:35:14 +0100
commit12ba2c9c8c0f134056fc5aae60682aac2510fe13 (patch)
tree0945b2accbdb61f34f8a81b4d22710a29baaac60
parent5e6ce90dbd3894069c32bb09ccfd5ac265f3f1b1 (diff)
downloadglibc-12ba2c9c8c0f134056fc5aae60682aac2510fe13.tar.gz
glibc-12ba2c9c8c0f134056fc5aae60682aac2510fe13.tar.xz
glibc-12ba2c9c8c0f134056fc5aae60682aac2510fe13.zip
More regex memory leak fixes and tests.
(cherry picked from commit e9b9cbf5e9bdcda6f0b50456658bac748202dd70)
-rw-r--r--ChangeLog9
-rw-r--r--posix/bug-regex31.c34
-rw-r--r--posix/bug-regex31.input3
-rw-r--r--posix/regcomp.c9
4 files changed, 45 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 6d7475b6d9..c1951cee66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2010-10-11  Ulrich Drepper  <drepper@gmail.com>
 
+	* posix/bug-regex31.c: Rewrite to run multiple tests from stdin.
+	* posix/bug-regex31.input: New file.
+
+	[BZ #12078]
+	* posix/regcomp.c (parse_branch): Free memory when allocation failed.
+	(parse_sub_exp): Fix last change, use postorder.
+
+2010-10-11  Ulrich Drepper  <drepper@gmail.com>
+
 	* posix/bug-regex31.c: New file.
 	* posix/Makefile: Add rules to build and run bug-regex31.
 
diff --git a/posix/bug-regex31.c b/posix/bug-regex31.c
index 2d5d6695d4..974e8603b9 100644
--- a/posix/bug-regex31.c
+++ b/posix/bug-regex31.c
@@ -3,14 +3,34 @@
 #include <stdio.h>
 #include <sys/types.h>
 
-int main()
+int
+main (void)
 {
- regex_t regex;
- int rc;
-
   mtrace ();
 
- if ((rc = regcomp (&regex, "([0]", REG_EXTENDED)))
-   printf ("Error %d (expected)\n", rc);
- return 0;
+  int res = 0;
+  char *buf = NULL;
+  size_t len = 0;
+  while (! feof (stdin))
+    {
+      ssize_t n = getline (&buf, &len, stdin);
+      if (n <= 0)
+	break;
+      if (buf[n - 1] == '\n')
+	buf[n - 1] = '\0';
+
+      regex_t regex;
+      int rc = regcomp (&regex, buf, REG_EXTENDED);
+      if (rc != 0)
+	printf ("%s: Error %d (expected)\n", buf, rc);
+      else
+	{
+	  printf ("%s: succeeded !\n", buf);
+	  res = 1;
+	}
+    }
+
+  free (buf);
+
+  return 0;
 }
diff --git a/posix/bug-regex31.input b/posix/bug-regex31.input
new file mode 100644
index 0000000000..eea961ccf5
--- /dev/null
+++ b/posix/bug-regex31.input
@@ -0,0 +1,3 @@
+([0]
+([0]a
+([0]([0])
diff --git a/posix/regcomp.c b/posix/regcomp.c
index 9f5ca2cd0e..4ee7b90ace 100644
--- a/posix/regcomp.c
+++ b/posix/regcomp.c
@@ -2164,12 +2164,15 @@ parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
 	}
       if (tree != NULL && exp != NULL)
 	{
-	  tree = create_tree (dfa, tree, exp, CONCAT);
-	  if (tree == NULL)
+	  bin_tree_t *newtree = create_tree (dfa, tree, exp, CONCAT);
+	  if (newtree == NULL)
 	    {
+	      postorder (exp, free_tree, NULL);
+	      postorder (tree, free_tree, NULL);
 	      *err = REG_ESPACE;
 	      return NULL;
 	    }
+	  tree = newtree;
 	}
       else if (tree == NULL)
 	tree = exp;
@@ -2420,7 +2423,7 @@ parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
       if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
 	{
 	  if (tree != NULL)
-	    free_tree (NULL, tree);
+	    postorder (tree, free_tree, NULL);
 	  *err = REG_EPAREN;
 	}
       if (BE (*err != REG_NOERROR, 0))