GNU C Library master sources branch, master, updated. glibc-2.12-185-ge9b9cbf

drepper@sourceware.org drepper@sourceware.org
Tue Oct 12 02:48:00 GMT 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  e9b9cbf5e9bdcda6f0b50456658bac748202dd70 (commit)
      from  ef06edbee6463061a7f3dcbd2f56a625b41a4810 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=e9b9cbf5e9bdcda6f0b50456658bac748202dd70

commit e9b9cbf5e9bdcda6f0b50456658bac748202dd70
Author: Ulrich Drepper <drepper@gmail.com>
Date:   Mon Oct 11 22:46:44 2010 -0400

    More regex memory leak fixes and tests.

diff --git a/ChangeLog b/ChangeLog
index ee11d29..2192364 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 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.
+
 	* 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 2d5d669..974e860 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 0000000..eea961c
--- /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 9f5ca2c..4ee7b90 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))

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog               |    7 +++++++
 posix/bug-regex31.c     |   34 +++++++++++++++++++++++++++-------
 posix/bug-regex31.input |    3 +++
 posix/regcomp.c         |    9 ++++++---
 4 files changed, 43 insertions(+), 10 deletions(-)
 create mode 100644 posix/bug-regex31.input


hooks/post-receive
-- 
GNU C Library master sources



More information about the Glibc-cvs mailing list