Skip to content

Commit d9e9b44

Browse files
jeffhostetlergitster
authored andcommitted
sparse-index: copy dir_hash in ensure_full_index()
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 <[email protected]> Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 225bc32 commit d9e9b44

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

sparse-index.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ void ensure_full_index(struct index_state *istate)
283283

284284
/* Copy back into original index. */
285285
memcpy(&istate->name_hash, &full->name_hash, sizeof(full->name_hash));
286+
memcpy(&istate->dir_hash, &full->dir_hash, sizeof(full->dir_hash));
286287
istate->sparse_index = 0;
287288
free(istate->cache);
288289
istate->cache = full->cache;

0 commit comments

Comments
 (0)