diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2014-06-19 15:38:03 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2014-06-19 19:00:03 +0200 |
commit | 4d43ef1e7434d7d419afbcd754931cb0c794763c (patch) | |
tree | 90c7ac031522e1cf820330f4ad79a267322b5060 /posix/regcomp.c | |
parent | 51a7380b8968251a49a4c5b0bc7ed1af5b0512c6 (diff) | |
download | glibc-4d43ef1e7434d7d419afbcd754931cb0c794763c.tar.gz glibc-4d43ef1e7434d7d419afbcd754931cb0c794763c.tar.xz glibc-4d43ef1e7434d7d419afbcd754931cb0c794763c.zip |
Fix memory leak in regexp compiler (BZ #17069)
Diffstat (limited to 'posix/regcomp.c')
-rw-r--r-- | posix/regcomp.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/posix/regcomp.c b/posix/regcomp.c index 921d0f49a3..a5020be192 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -2415,14 +2415,21 @@ 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; } |