regex: use regexec_buf()
The new regexec_buf() function operates on buffers with an explicitly specified length, rather than NUL-terminated strings. We need to use this function whenever the buffer we want to pass to regexec(3) may have been mmap(2)ed (and is hence not NUL-terminated). Note: the original motivation for this patch was to fix a bug where `git diff -G <regex>` would crash. This patch converts more callers, though, some of which allocated to construct NUL-terminated strings, or worse, modified buffers to temporarily insert NULs while calling regexec(3). By converting them to use regexec_buf(), the code has become much cleaner. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
2f8952250a
commit
b7d36ffca0
14
grep.c
14
grep.c
@ -848,17 +848,6 @@ static int fixmatch(struct grep_pat *p, char *line, char *eol,
|
||||
}
|
||||
}
|
||||
|
||||
static int regmatch(const regex_t *preg, char *line, char *eol,
|
||||
regmatch_t *match, int eflags)
|
||||
{
|
||||
#ifdef REG_STARTEND
|
||||
match->rm_so = 0;
|
||||
match->rm_eo = eol - line;
|
||||
eflags |= REG_STARTEND;
|
||||
#endif
|
||||
return regexec(preg, line, 1, match, eflags);
|
||||
}
|
||||
|
||||
static int patmatch(struct grep_pat *p, char *line, char *eol,
|
||||
regmatch_t *match, int eflags)
|
||||
{
|
||||
@ -869,7 +858,8 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
|
||||
else if (p->pcre_regexp)
|
||||
hit = !pcrematch(p, line, eol, match, eflags);
|
||||
else
|
||||
hit = !regmatch(&p->regexp, line, eol, match, eflags);
|
||||
hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,
|
||||
eflags);
|
||||
|
||||
return hit;
|
||||
}
|
||||
|
Reference in New Issue
Block a user