path: root/grep.c
diff options
authorJohannes Schindelin <>2016-09-21 18:24:14 (GMT)
committerJunio C Hamano <>2016-09-21 20:56:15 (GMT)
commitb7d36ffca02c23f545d6e098d78180e6e72dfd8d (patch)
treeee20baae52d14d948c581efdbf30aff6fa2ee62e /grep.c
parent2f8952250a84313b74f96abb7b035874854cf202 (diff)
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 <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'grep.c')
1 files changed, 2 insertions, 12 deletions
diff --git a/grep.c b/grep.c
index 528b652..8ed5623 100644
--- a/grep.c
+++ b/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)
- match->rm_so = 0;
- match->rm_eo = eol - line;
- eflags |= REG_STARTEND;
- 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);
- hit = !regmatch(&p->regexp, line, eol, match, eflags);
+ hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,
+ eflags);
return hit;