diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2022-06-24 17:53:34 -0500 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2022-06-24 18:36:53 -0500 |
commit | e2aec8c91e9d6ed3fc76f9f145dec8a456ce623a (patch) | |
tree | 58d87428e4935e6b5fe11047e86e16c2610a8f7e /src | |
parent | 225d921887128df688722f40c69d41e4ed847b26 (diff) | |
download | grep-e2aec8c91e9d6ed3fc76f9f145dec8a456ce623a.tar.gz |
grep: fix regex compilation memory leaks
Problem reported by Jim Meyering in:
https://lists.gnu.org/r/grep-devel/2022-06/msg00012.html
* src/dfasearch.c (regex_compile): Fix memory leaks when SYNTAX_ONLY.
Diffstat (limited to 'src')
-rw-r--r-- | src/dfasearch.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/dfasearch.c b/src/dfasearch.c index 8d832f0c..2720b3a3 100644 --- a/src/dfasearch.c +++ b/src/dfasearch.c @@ -144,26 +144,34 @@ regex_compile (struct dfa_comp *dc, char const *p, idx_t len, idx_t pcount, idx_t lineno, reg_syntax_t syntax_bits, bool syntax_only) { - struct re_pattern_buffer pat0; - struct re_pattern_buffer *pat = syntax_only ? &pat0 : &dc->patterns[pcount]; - pat->buffer = NULL; - pat->allocated = 0; + struct re_pattern_buffer pat; + pat.buffer = NULL; + pat.allocated = 0; /* Do not use a fastmap with -i, to work around glibc Bug#20381. */ verify (UCHAR_MAX < IDX_MAX); idx_t uchar_max = UCHAR_MAX; - pat->fastmap = (syntax_only | match_icase) ? NULL : ximalloc (uchar_max + 1); + pat.fastmap = syntax_only | match_icase ? NULL : ximalloc (uchar_max + 1); - pat->translate = NULL; + pat.translate = NULL; if (syntax_only) re_set_syntax (syntax_bits | RE_NO_SUB); else re_set_syntax (syntax_bits); - char const *err = re_compile_pattern (p, len, pat); + char const *err = re_compile_pattern (p, len, &pat); if (!err) - return true; + { + if (syntax_only) + regfree (&pat); + else + dc->patterns[pcount] = pat; + + return true; + } + + free (pat.fastmap); /* Emit a filename:lineno: prefix for patterns taken from files. */ idx_t pat_lineno; |