rerere forget: do not segfault if not all stages are present
authorJohannes Sixt <j6t@kdbg.org>
Thu, 4 Apr 2013 18:41:43 +0000 (20:41 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 4 Apr 2013 19:27:28 +0000 (12:27 -0700)
commitb9e31f59478eeae3e4230308f6fc06713c6fc547
tree8efa207ccba7125535840a5dc6a90c601c8701dc
parent53d8afafbbf455d24b0a94e4114709a4d495d460
rerere forget: do not segfault if not all stages are present

The loop that fills in the buffers that are later passed to the merge
driver exits early when not all stages of a path are present in the index.
But since the buffer pointers are not initialized in advance, the
subsequent accesses are undefined.

Initialize buffer pointers in advance to avoid undefined behavior later.

That is not sufficient, though, to get correct operation of handle_cache().
The function replays a conflicted merge to extract the part inside the
conflict markers. As written, the loop exits early when a stage is missing.
Consequently, the buffers for later stages that would be present in the
index are not filled in and the merge is replayed with incomplete data.

Fix it by investigating all stages of the given path.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
rerere.c
t/t2030-unresolve-info.sh