From: Junio C Hamano Date: Fri, 20 May 2011 18:41:06 GMT Subject: Re: [PATCH] do not read beyond end of malloc'd buffer Message-ID: <7vfwo92p19.fsf@alter.siamese.dyndns.org> In-Reply-To: <877h9lb86r.fsf@rho.meyering.net> Jim Meyering writes: > I was surprised to see "git diff --word-diff" output a ton of > garbage, and tracked it down to a bug that's triggered when the > diff.suppress-blank-empty config option to true and when at least > one of the context lines is empty. Heh, I am not that surprised ;-) I think the real culprit is a year-old 882749a (diff: add --word-diff option that generalizes --color-words, 2010-04-14); it probably shows that not many people use diff.s-b-e settings? > printf 'a\n\n[-b-]{+c+}\n' > exp > git init && git config diff.suppress-blank-empty true > printf 'a\n\nb\n' > f && git add . && git commit -m. . > printf 'a\n\nc\n' > f > git diff --word-diff | tail -3 > out > diff out exp > > Before the patch, the git diff ... command would read from beyond > the end of a heap buffer, and "out" would contain far more than the > expected 5 bytes. It is a bit unfortunate that we cannot make this into a test script, as it depends on what is on the uninitialized part of the heap, which might happen to be a NUL in which case the test would pass. Running tests under the valgrind mode may catch issues, though. Thanks. Will queue with this test squashed in. diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh index 37aeab0..c374aa4 100755 --- a/t/t4034-diff-words.sh +++ b/t/t4034-diff-words.sh @@ -307,4 +307,30 @@ test_language_driver python test_language_driver ruby test_language_driver tex +test_expect_success 'word-diff with diff.sbe' ' + cat >expect <<-\EOF && + diff --git a/pre b/post + index a1a53b5..bc8fe6d 100644 + --- a/pre + +++ b/post + @@ -1,3 +1,3 @@ + a + + [-b-]{+c+} + EOF + cat >pre <<-\EOF && + a + + b + EOF + cat >post <<-\EOF && + a + + c + EOF + test_when_finished "git config --unset diff.suppress-blank-empty" && + git config diff.suppress-blank-empty true && + word_diff --word-diff=plain +' + test_done