Revision 421b488a58fea89ceb55d5b358738e9251d44f5e authored by Jeff King on 23 October 2008, 04:31:03 UTC, committed by Junio C Hamano on 02 November 2008, 06:46:40 UTC
In the main loop of find_deltas, we do:

  struct object_entry *entry = *list++;
  ...
  if (!*list_size)
	  ...
	  break

Because we look at and increment *list _before_ the check of
list_size, in the very last iteration of the loop we will
look at uninitialized data, and increment the pointer beyond
one past the end of the allocated space. Since we don't
actually do anything with the data until after the check,
this is not a problem in practice.

But since it technically violates the C standard, and
because it provokes a spurious valgrind warning, let's just
move the initialization of entry to a safe place.

This fixes valgrind errors in t5300, t5301, t5302, t303, and
t9400.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 13494ed
Raw File
t4103-apply-binary.sh
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#

test_description='git apply handling binary patches

'
. ./test-lib.sh

# setup

cat >file1 <<EOF
A quick brown fox jumps over the lazy dog.
A tiny little penguin runs around in circles.
There is a flag with Linux written on it.
A slow black-and-white panda just sits there,
munching on his bamboo.
EOF
cat file1 >file2
cat file1 >file4

git update-index --add --remove file1 file2 file4
git commit -m 'Initial Version' 2>/dev/null

git checkout -b binary
perl -pe 'y/x/\000/' <file1 >file3
cat file3 >file4
git add file2
perl -pe 'y/\000/v/' <file3 >file1
rm -f file2
git update-index --add --remove file1 file2 file3 file4
git commit -m 'Second Version'

git diff-tree -p master binary >B.diff
git diff-tree -p -C master binary >C.diff

git diff-tree -p --binary master binary >BF.diff
git diff-tree -p --binary -C master binary >CF.diff

test_expect_success 'stat binary diff -- should not fail.' \
	'git checkout master
	 git apply --stat --summary B.diff'

test_expect_success 'stat binary diff (copy) -- should not fail.' \
	'git checkout master
	 git apply --stat --summary C.diff'

test_expect_success 'check binary diff -- should fail.' \
	'git checkout master &&
	 test_must_fail git apply --check B.diff'

test_expect_success 'check binary diff (copy) -- should fail.' \
	'git checkout master &&
	 test_must_fail git apply --check C.diff'

test_expect_success \
	'check incomplete binary diff with replacement -- should fail.' '
	git checkout master &&
	test_must_fail git apply --check --allow-binary-replacement B.diff
'

test_expect_success \
    'check incomplete binary diff with replacement (copy) -- should fail.' '
	 git checkout master &&
	 test_must_fail git apply --check --allow-binary-replacement C.diff
'

test_expect_success 'check binary diff with replacement.' \
	'git checkout master
	 git apply --check --allow-binary-replacement BF.diff'

test_expect_success 'check binary diff with replacement (copy).' \
	'git checkout master
	 git apply --check --allow-binary-replacement CF.diff'

# Now we start applying them.

do_reset () {
	rm -f file? &&
	git reset --hard &&
	git checkout -f master
}

test_expect_success 'apply binary diff -- should fail.' \
	'do_reset &&
	 test_must_fail git apply B.diff'

test_expect_success 'apply binary diff -- should fail.' \
	'do_reset &&
	 test_must_fail git apply --index B.diff'

test_expect_success 'apply binary diff (copy) -- should fail.' \
	'do_reset &&
	 test_must_fail git apply C.diff'

test_expect_success 'apply binary diff (copy) -- should fail.' \
	'do_reset &&
	 test_must_fail git apply --index C.diff'

test_expect_success 'apply binary diff without replacement.' \
	'do_reset &&
	 git apply BF.diff'

test_expect_success 'apply binary diff without replacement (copy).' \
	'do_reset &&
	 git apply CF.diff'

test_expect_success 'apply binary diff.' \
	'do_reset &&
	 git apply --allow-binary-replacement --index BF.diff &&
	 test -z "$(git diff --name-status binary)"'

test_expect_success 'apply binary diff (copy).' \
	'do_reset &&
	 git apply --allow-binary-replacement --index CF.diff &&
	 test -z "$(git diff --name-status binary)"'

test_done
back to top