summary refs log tree commit diff
path: root/posix/regcomp.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2010-10-11 22:46:44 -0400
committerUlrich Drepper <drepper@gmail.com>2010-10-11 22:46:44 -0400
commite9b9cbf5e9bdcda6f0b50456658bac748202dd70 (patch)
treef7c25be42fb102aa3f4d7d611e14ac6d84b82eca /posix/regcomp.c
parentef06edbee6463061a7f3dcbd2f56a625b41a4810 (diff)
downloadglibc-e9b9cbf5e9bdcda6f0b50456658bac748202dd70.tar.gz
glibc-e9b9cbf5e9bdcda6f0b50456658bac748202dd70.tar.xz
glibc-e9b9cbf5e9bdcda6f0b50456658bac748202dd70.zip
More regex memory leak fixes and tests.
Diffstat (limited to 'posix/regcomp.c')
-rw-r--r--posix/regcomp.c9
1 files changed, 6 insertions, 3 deletions
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))