summaryrefslogtreecommitdiff
path: root/quote.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2010-02-01 13:39:03 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-02-06 18:55:03 (GMT)
commit8424981934c415bd20643de9cc932bd348dfb115 (patch)
tree13f59513d4c5c227bfac6d51c45e8c4e997379be /quote.c
parentd2d66f15b620c8e96219cfe339f32e77bfaf69b4 (diff)
downloadgit-8424981934c415bd20643de9cc932bd348dfb115.zip
git-8424981934c415bd20643de9cc932bd348dfb115.tar.gz
git-8424981934c415bd20643de9cc932bd348dfb115.tar.bz2
Fix invalid read in quote_c_style_counted
This function did not work on strings that were not NUL-terminated. It reads through a length-bounded string, searching for characters in need of quoting. After we find one, we output the quoted character, then advance our pointer to find the next one. However, we never decremented the length, meaning we ended up looking at whatever random junk was stored after the string. This bug was not found by the existing tests because most code paths feed a NUL-terminated string. The notable exception is a directory name being fed by ls-tree. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'quote.c')
-rw-r--r--quote.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/quote.c b/quote.c
index acb6bf9..fc93435 100644
--- a/quote.c
+++ b/quote.c
@@ -213,7 +213,7 @@ static size_t quote_c_style_counted(const char *name, ssize_t maxlen,
int ch;
len = next_quote_pos(p, maxlen);
- if (len == maxlen || !p[len])
+ if (len == maxlen || (maxlen < 0 && !p[len]))
break;
if (!no_dq && p == name)
@@ -223,6 +223,8 @@ static size_t quote_c_style_counted(const char *name, ssize_t maxlen,
EMIT('\\');
p += len;
ch = (unsigned char)*p++;
+ if (maxlen >= 0)
+ maxlen -= len + 1;
if (sq_lookup[ch] >= ' ') {
EMIT(sq_lookup[ch]);
} else {