read-tree A B C: do not create a bogus index and do not segfault
authorJunio C Hamano <gitster@pobox.com>
Thu, 12 Mar 2009 07:02:12 +0000 (00:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 Mar 2009 00:06:07 +0000 (17:06 -0700)
commitaab3b9a1aa3b7d082088ab014480b5d81c437624
treec6df8e2142eb19f51c4abc6f13755b5a11785458
parentea02eef096d4bfcbb83e76cfab0fcb42dbcad35e
read-tree A B C: do not create a bogus index and do not segfault

"git read-tree A B C..." without the "-m" (merge) option is a way to read
these trees on top of each other to get an overlay of them.

An ancient commit ee6566e (Rewrite read-tree, 2005-09-05) passed the
ADD_CACHE_SKIP_DFCHECK flag when calling add_index_entry() to add the
paths obtained from these trees to the index, but it is an incorrect use
of the flag.  The flag is meant to be used by callers who know the
addition of the entry does not introduce a D/F conflict to the index in
order to avoid the overhead of checking.

This bug resulted in a bogus index that records both "x" and "x/z" as a
blob after reading three trees that have paths ("x"), ("x", "y"), and
("x/z", "y") respectively.  34110cd (Make 'unpack_trees()' have a separate
source and destination index, 2008-03-06) refactored the callsites of
add_index_entry() incorrectly and added more codepaths that use this flag
when it shouldn't be used.

Also, 0190457 (Move 'unpack_trees()' over to 'traverse_trees()' interface,
2008-03-05) introduced a bug to call add_index_entry() for the tree that
does not have the path in it, passing NULL as a cache entry.  This caused
reading multiple trees, one of which has path "x" but another doesn't, to
segfault.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t1008-read-tree-overlay.sh [new file with mode: 0755]
unpack-trees.c