diff options
author | Ulrich Drepper <drepper@gmail.com> | 2010-10-11 11:46:22 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2010-10-11 11:46:22 -0400 |
commit | a129c80d54ec951567caa8c1b042275422d5f367 (patch) | |
tree | 1ed6df786f2883d65f45461a431c6041f002dbef | |
parent | b76b818e6fe2061e778b3a9bbe63c554c3f9b3c1 (diff) | |
download | glibc-a129c80d54ec951567caa8c1b042275422d5f367.tar glibc-a129c80d54ec951567caa8c1b042275422d5f367.tar.gz glibc-a129c80d54ec951567caa8c1b042275422d5f367.tar.bz2 glibc-a129c80d54ec951567caa8c1b042275422d5f367.zip |
Fix memory leak for some invalid regular expressions.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | posix/regcomp.c | 10 |
3 files changed, 15 insertions, 2 deletions
@@ -1,5 +1,10 @@ 2010-10-11 Ulrich Drepper <drepper@gmail.com> + * posix/regcomp.c (parse_bracket_exp): Add missing re_free calls. + + [BZ #12078] + * posix/regcomp.c (parse_sub_exp): Free tree data when it is not used. + [BZ #12108] * stdio-common/psiginfo.c (psiginfo): Don't expext SIGRTMIN..SIGRTMAX to have entries in sys_siglist. @@ -10,7 +10,7 @@ Version 2.13 * The following bugs are resolved with this release: 3268, 7066, 10851, 11611, 11640, 11701, 11840, 11856, 11883, 11903, 11904, - 11968, 11979, 12005, 12037, 12067, 12077, 12092, 12093, 12107, 12108 + 11968, 11979, 12005, 12037, 12067, 12077, 12078, 12092, 12093, 12107, 12108 * New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark diff --git a/posix/regcomp.c b/posix/regcomp.c index 03ab123907..9f5ca2cd0e 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -2418,7 +2418,11 @@ parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, { tree = parse_reg_exp (regexp, preg, token, syntax, nest, err); if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0)) - *err = REG_EPAREN; + { + if (tree != NULL) + free_tree (NULL, tree); + *err = REG_EPAREN; + } if (BE (*err != REG_NOERROR, 0)) return NULL; } @@ -3028,6 +3032,10 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, if (BE (sbcset == NULL, 0)) #endif /* RE_ENABLE_I18N */ { + re_free (sbcset); +#ifdef RE_ENABLE_I18N + re_free (mbcset); +#endif *err = REG_ESPACE; return NULL; } |