]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-index: copy dir_hash in ensure_full_index()
authorJeff Hostetler <jeffhost@microsoft.com>
Mon, 16 Aug 2021 17:48:55 +0000 (17:48 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 30 Aug 2021 16:24:12 +0000 (09:24 -0700)
Copy the 'index_state->dir_hash' back to the real istate after expanding
a sparse index.

A crash was observed in 'git status' during some hashmap lookups with
corrupted hashmap entries.  During an index expansion, new cache-entries
are added to the 'index_state->name_hash' and the 'dir_hash' in a
temporary 'index_state' variable 'full'.  However, only the 'name_hash'
hashmap from this temp variable was copied back into the real 'istate'
variable.  The original copy of the 'dir_hash' was incorrectly
preserved.  If the table in the 'full->dir_hash' hashmap were realloced,
the stale version (in 'istate') would be corrupted.

The test suite does not operate on index sizes sufficiently large to
trigger this reallocation, so they do not cover this behavior.
Increasing the test suite to cover such scale is fragile and likely
wasteful.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sparse-index.c

index c6b4feec413a8ffeda31cadee1a85020abca466b..56eb65dc349a7aede46d17dae9c17ce86ce96f05 100644 (file)
@@ -283,6 +283,7 @@ void ensure_full_index(struct index_state *istate)
 
        /* Copy back into original index. */
        memcpy(&istate->name_hash, &full->name_hash, sizeof(full->name_hash));
+       memcpy(&istate->dir_hash, &full->dir_hash, sizeof(full->dir_hash));
        istate->sparse_index = 0;
        free(istate->cache);
        istate->cache = full->cache;