mirror of
https://github.com/git/git.git
synced 2026-01-31 13:03:13 +00:00
Introduce a function to run regexec() on non-NUL-terminated buffers
We just introduced a test that demonstrates that our sloppy use of regexec() on a mmap()ed area can result in incorrect results or even hard crashes. So what we need to fix this is a function that calls regexec() on a length-delimited, rather than a NUL-terminated, string. Happily, there is an extension to regexec() introduced by the NetBSD project and present in all major regex implementation including Linux', MacOSX' and the one Git includes in compat/regex/: by using the (non-POSIX) REG_STARTEND flag, it is possible to tell the regexec() function that it should only look at the offsets between pmatch[0].rm_so and pmatch[0].rm_eo. That is exactly what we need. Since support for REG_STARTEND is so widespread by now, let's just introduce a helper function that uses it, and fall back to allocating and constructing a NUL-terminated when REG_STARTEND is not available. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
@@ -965,6 +965,27 @@ void git_qsort(void *base, size_t nmemb, size_t size,
|
||||
#define qsort git_qsort
|
||||
#endif
|
||||
|
||||
static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size,
|
||||
size_t nmatch, regmatch_t pmatch[], int eflags)
|
||||
{
|
||||
#ifdef REG_STARTEND
|
||||
assert(nmatch > 0 && pmatch);
|
||||
pmatch[0].rm_so = 0;
|
||||
pmatch[0].rm_eo = size;
|
||||
return regexec(preg, buf, nmatch, pmatch, eflags | REG_STARTEND);
|
||||
#else
|
||||
char *buf2 = xmalloc(size + 1);
|
||||
int ret;
|
||||
|
||||
memcpy(buf2, buf, size);
|
||||
buf2[size] = '\0';
|
||||
ret = regexec(preg, buf2, nmatch, pmatch, eflags);
|
||||
free(buf2);
|
||||
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef DIR_HAS_BSD_GROUP_SEMANTICS
|
||||
# define FORCE_DIR_SET_GID S_ISGID
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user