Skip to content

Commit

Permalink
Fix invalid read in quote_c_style_counted
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Feb 6, 2010
1 parent d2d66f1 commit 8424981
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
4 changes: 3 additions & 1 deletion quote.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 {
Expand Down
19 changes: 18 additions & 1 deletion t/t3902-quoted.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@ for_each_name () {
for name in \
Name "Name and a${LF}LF" "Name and an${HT}HT" "Name${DQ}" \
"$FN$HT$GN" "$FN$LF$GN" "$FN $GN" "$FN$GN" "$FN$DQ$GN" \
"With SP in it"
"With SP in it" "caractère spécial/file"
do
eval "$1"
done
}

test_expect_success setup '
mkdir "caractère spécial" &&
for_each_name "echo initial >\"\$name\""
git add . &&
git commit -q -m Initial &&
Expand All @@ -50,6 +51,7 @@ Name
"Name and an\tHT"
"Name\""
With SP in it
"caract\303\250re sp\303\251cial/file"
"\346\277\261\351\207\216\t\347\264\224"
"\346\277\261\351\207\216\n\347\264\224"
"\346\277\261\351\207\216 \347\264\224"
Expand All @@ -63,6 +65,7 @@ Name
"Name and an\tHT"
"Name\""
With SP in it
caractère spécial/file
"濱野\t純"
"濱野\n純"
濱野 純
Expand Down Expand Up @@ -97,6 +100,13 @@ test_expect_success 'check fully quoted output from diff-tree' '
'

test_expect_success 'check fully quoted output from ls-tree' '
git ls-tree --name-only -r HEAD >current &&
test_cmp expect.quoted current
'

test_expect_success 'setting core.quotepath' '
git config --bool core.quotepath false
Expand Down Expand Up @@ -130,4 +140,11 @@ test_expect_success 'check fully quoted output from diff-tree' '
'

test_expect_success 'check fully quoted output from ls-tree' '
git ls-tree --name-only -r HEAD >current &&
test_cmp expect.raw current
'

test_done

0 comments on commit 8424981

Please sign in to comment.