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
3
diff.c
3
diff.c
@ -941,7 +941,8 @@ static int find_word_boundaries(mmfile_t *buffer, regex_t *word_regex,
|
||||
{
|
||||
if (word_regex && *begin < buffer->size) {
|
||||
regmatch_t match[1];
|
||||
if (!regexec(word_regex, buffer->ptr + *begin, 1, match, 0)) {
|
||||
if (!regexec_buf(word_regex, buffer->ptr + *begin,
|
||||
buffer->size - *begin, 1, match, 0)) {
|
||||
char *p = memchr(buffer->ptr + *begin + match[0].rm_so,
|
||||
'\n', match[0].rm_eo - match[0].rm_so);
|
||||
*end = p ? p - buffer->ptr : match[0].rm_eo + *begin;
|
||||
|
||||
Reference in New Issue
Block a user