mv: handle lstat() failure correctly
commit72695d8214791161a943086e894874b4fd71ba9f
authorSebastian Thiel <sebastian.thiel@icloud.com>
Wed, 9 Aug 2023 07:47:41 +0000 (9 07:47 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Aug 2023 18:46:12 +0000 (9 11:46 -0700)
treeca6ce6929e54f372f3a5a26ef1b1ffc3a262430b
parentfb7d80edcae482f4fa5d4be0227dc3054734e5f3
mv: handle lstat() failure correctly

When moving a directory onto another with `git mv` various checks are
performed. One of of these validates that the destination is not existing.

When calling `lstat` on the destination path and it fails as the path
doesn't exist, some environments seem to overwrite the passed  in
`stat` memory nonetheless (I observed this issue on debian 12 of x86_64,
running on OrbStack on ARM, emulated with Rosetta).

This would affect the code that followed as it would still acccess a now
modified `st` structure, which now seems to contain uninitialized memory.
`S_ISDIR(st_dir_mode)` would then typically return false causing the code
to run into a bad case.

The fix avoids overwriting the existing `st` structure, providing an
alternative that exists only for that purpose.

Note that this patch minimizes complexity instead of stack-frame size.

Signed-off-by: Sebastian Thiel <sebastian.thiel@icloud.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/mv.c
t/t7001-mv.sh