bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] regex: fix memory leak in compiler


From: Paul Eggert
Subject: [PATCH 2/2] regex: fix memory leak in compiler
Date: Thu, 19 Jun 2014 08:51:30 -0700

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.
---
 ChangeLog     |  6 ++++++
 lib/regcomp.c | 14 +++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 687a79d..53b2871 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2014-06-19  Paul Eggert  <address@hidden>
 
+       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  <address@hidden>
        Combine __USE_BSD and __USE_SVID into __USE_MISC.
diff --git a/lib/regcomp.c b/lib/regcomp.c
index 56faf11..16d0e21 100644
--- a/lib/regcomp.c
+++ b/lib/regcomp.c
@@ -2460,14 +2460,22 @@ parse_expression (re_string_t *regexp, regex_t *preg, 
re_token_t *token,
   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;
        }
-- 
1.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]