From: Paul Eggert Date: Thu, 19 Jun 2014 15:51:30 +0000 (-0700) Subject: regex: fix memory leak in compiler X-Git-Tag: v1.0~7348 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=316c9c508c315504b55c935ffd409b60135f918e;p=gnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index 687a79d7b2..53b28711b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2014-06-19 Paul Eggert + 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 Combine __USE_BSD and __USE_SVID into __USE_MISC. diff --git a/lib/regcomp.c b/lib/regcomp.c index 56faf11c42..16d0e21595 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; }