diff options
author | Ulrich Drepper <drepper@gmail.com> | 2010-10-11 22:46:44 -0400 |
---|---|---|
committer | Andreas Schwab <schwab@redhat.com> | 2010-12-01 15:35:14 +0100 |
commit | 12ba2c9c8c0f134056fc5aae60682aac2510fe13 (patch) | |
tree | 0945b2accbdb61f34f8a81b4d22710a29baaac60 | |
parent | 5e6ce90dbd3894069c32bb09ccfd5ac265f3f1b1 (diff) | |
download | glibc-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-- | ChangeLog | 9 | ||||
-rw-r--r-- | posix/bug-regex31.c | 34 | ||||
-rw-r--r-- | posix/bug-regex31.input | 3 | ||||
-rw-r--r-- | posix/regcomp.c | 9 |
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 (®ex, "([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 (®ex, 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)) |