summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2022-06-24 17:53:34 -0500
committerPaul Eggert <eggert@cs.ucla.edu>2022-06-24 18:36:53 -0500
commite2aec8c91e9d6ed3fc76f9f145dec8a456ce623a (patch)
tree58d87428e4935e6b5fe11047e86e16c2610a8f7e /src
parent225d921887128df688722f40c69d41e4ed847b26 (diff)
downloadgrep-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.c24
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;