changeset 17710:fe5bf4d5ee95

regex: fix memory leak in compiler Fix by Andreas Schwab in: https://sourceware.org/ml/libc-alpha/2014-06/msg00462.html * lib/regcomp.c (parse_expression): Deallocate partially constructed tree before returning error.
author Paul Eggert <eggert@penguin.cs.ucla.edu>
date Thu, 19 Jun 2014 08:51:30 -0700
parents e76613a60b02
children bbf6398214e1
files ChangeLog lib/regcomp.c
diffstat 2 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Jun 19 08:22:20 2014 -0700
+++ b/ChangeLog	Thu Jun 19 08:51:30 2014 -0700
@@ -1,5 +1,11 @@
 2014-06-19  Paul Eggert  <eggert@penguin.cs.ucla.edu>
 
+	regex: fix memory leak in compiler
+	Fix by Andreas Schwab in:
+	https://sourceware.org/ml/libc-alpha/2014-06/msg00462.html
+	* lib/regcomp.c (parse_expression): Deallocate partially
+	constructed tree before returning error.
+
 	regex: merge patch from libc
 	2014-02-12  Joseph Myers  <joseph@codesourcery.com>
 	Combine __USE_BSD and __USE_SVID into __USE_MISC.
--- a/lib/regcomp.c	Thu Jun 19 08:22:20 2014 -0700
+++ b/lib/regcomp.c	Thu Jun 19 08:51:30 2014 -0700
@@ -2460,14 +2460,22 @@
   while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
 	 || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
     {
-      tree = parse_dup_op (tree, regexp, dfa, token, syntax, err);
-      if (BE (*err != REG_NOERROR && tree == NULL, 0))
-	return NULL;
+      bin_tree_t *dup_tree = parse_dup_op (tree, regexp, dfa, token,
+					   syntax, err);
+      if (BE (*err != REG_NOERROR && dup_tree == NULL, 0))
+	{
+	  if (tree != NULL)
+	    postorder (tree, free_tree, NULL);
+	  return NULL;
+	}
+      tree = dup_tree;
       /* In BRE consecutive duplications are not allowed.  */
       if ((syntax & RE_CONTEXT_INVALID_DUP)
 	  && (token->type == OP_DUP_ASTERISK
 	      || token->type == OP_OPEN_DUP_NUM))
 	{
+	  if (tree != NULL)
+	    postorder (tree, free_tree, NULL);
 	  *err = REG_BADRPT;
 	  return NULL;
 	}