diff: fix infinite loop with --color-moved --ignore-space-change
commitfa5ba2c1dd0ce1bd060f423e7b1eb39d06fcd2cd
authorJeff King <peff@peff.net>
Fri, 13 Oct 2017 00:18:37 +0000 (12 20:18 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Oct 2017 02:57:45 +0000 (16 11:57 +0900)
treeecd489b63eb5312408ff2c54b98f0d872db1a068
parent58aaced4442a6daae1c82318f3f9259001714505
diff: fix infinite loop with --color-moved --ignore-space-change

The --color-moved code uses next_byte() to advance through
the blob contents. When the user has asked to ignore
whitespace changes, we try to collapse any whitespace change
down to a single space.

However, we enter the conditional block whenever we see the
IGNORE_WHITESPACE_CHANGE flag, even if the next byte isn't
whitespace.

This means that the combination of "--color-moved and
--ignore-space-change" was completely broken. Worse, because
we return from next_byte() without having advanced our
pointer, the function makes no forward progress in the
buffer and loops infinitely.

Fix this by entering the conditional only when we actually
see whitespace. We can apply this also to the
IGNORE_WHITESPACE change. That code path isn't buggy
(because it falls through to returning the next
non-whitespace byte), but it makes the logic more clear if
we only bother to look at whitespace flags after seeing that
the next byte is whitespace.

Reported-by: Orgad Shaneh <orgads@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
t/t4015-diff-whitespace.sh