fsmonitor: fix memory corruption in some corner cases
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 17 Mar 2021 15:30:48 +0000 (15:30 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Mar 2021 19:19:26 +0000 (12:19 -0700)
commit3dfd30598bdb34078329aa9bd9b03c5ab5cdbcce
tree01b826a0eb97742c08b59e0375552986a827a3c9
parent94f6e3e283f2adfc518b39cfc39291f1c2832ad0
fsmonitor: fix memory corruption in some corner cases

In 56c6910028a (fsmonitor: change last update timestamp on the
index_state to opaque token, 2020-01-07), we forgot to adjust the part
of `unpack_trees()` that copies the FSMonitor "last-update" information
that we copy from the source index to the result index since 679f2f9fdd2
(unpack-trees: skip stat on fsmonitor-valid files, 2019-11-20).

Since the "last-update" information is no longer a 64-bit number, but a
free-form string that has been allocated, we need to duplicate it rather
than just copying it.

This is important because there _are_ cases when `unpack_trees()` will
perform a oneway merge that implicitly calls `refresh_fsmonitor()`
(which will allocate that "last-update" token). This happens _after_
that token was copied into the result index. However, we _then_ call
`check_updates()` on that index, which will _also_ call
`refresh_fsmonitor()`, accessing the "last-update" string, which by now
would be released already.

In the instance that lead to this patch, this caused a segmentation
fault during a lengthy, complicated rebase involving the todo command
`reset` that (crucially) had to updated many files. Unfortunately, it
seems very hard to trigger that crash, therefore this patch is not
accompanied by a regression test.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
unpack-trees.c