• Jeff King's avatar
    run_diff_files: do not look at uninitialized stat data · 53048100
    Jeff King authored
    If we try to diff an index entry marked CE_VALID (because it
    was marked with --assume-unchanged), we do not bother even
    running stat() on the file to see if it was removed. This
    started long ago with 540e694b (Prevent diff machinery from
    examining assume-unchanged entries on worktree, 2009-08-11).
    However, the subsequent code may look at our "struct stat"
    and expect to find actual data; currently it will find
    whatever cruft was left on the stack. This can cause
    problems in two situations:
      1. We call match_stat_with_submodule with the stat data,
         so a submodule may be erroneously marked as changed.
      2. If --find-copies-harder is in effect, we pass all
         entries, even unchanged ones, to diff_change, so it can
         list them as rename/copy sources. Since we found no
         change, we assume that function will realize it and not
         actually display any diff output. However, we end up
         feeding it a bogus mode, leading it to sometimes claim
         there was a mode change.
    We can fix both by splitting the CE_VALID and regular code
    paths, and making sure only to look at the stat information
    in the latter. Furthermore, we push the declaration of our
    "struct stat" down into the code paths that actually set it,
    so we cannot accidentally access it uninitialized in future
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
t4039-diff-assume-unchanged.sh 1 KB