diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-09-29 16:49:44 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-09-29 16:49:45 -0700 |
commit | 300e95f7df240a0f6efea09d5e21fcc350e5ce83 (patch) | |
tree | 0b2a114656894e4177030ad6019e5581b3981d4c /git-compat-util.h | |
parent | d336b675680c7d4adc9f7190b7974b2ef10c0af4 (diff) | |
parent | b7d36ffca02c23f545d6e098d78180e6e72dfd8d (diff) | |
download | git-300e95f7df240a0f6efea09d5e21fcc350e5ce83.tar.gz |
Merge branch 'js/regexec-buf' into maint
Some codepaths in "git diff" used regexec(3) on a buffer that was
mmap(2)ed, which may not have a terminating NUL, leading to a read
beyond the end of the mapped region. This was fixed by introducing
a regexec_buf() helper that takes a <ptr,len> pair with REG_STARTEND
extension.
* js/regexec-buf:
regex: use regexec_buf()
regex: add regexec_buf() that can work on a non NUL-terminated string
regex: -G<pattern> feeds a non NUL-terminated string to regexec() and fails
Diffstat (limited to 'git-compat-util.h')
-rw-r--r-- | git-compat-util.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/git-compat-util.h b/git-compat-util.h index 68615b1a6a..2c949983dc 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -974,6 +974,19 @@ void git_qsort(void *base, size_t nmemb, size_t size, #define qsort git_qsort #endif +#ifndef REG_STARTEND +#error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd" +#endif + +static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size, + size_t nmatch, regmatch_t pmatch[], int eflags) +{ + assert(nmatch > 0 && pmatch); + pmatch[0].rm_so = 0; + pmatch[0].rm_eo = size; + return regexec(preg, buf, nmatch, pmatch, eflags | REG_STARTEND); +} + #ifndef DIR_HAS_BSD_GROUP_SEMANTICS # define FORCE_DIR_SET_GID S_ISGID #else |