Skip to content

Commit 4c490f3

Browse files
szedergitster
authored andcommitted
split-index: BUG() when cache entry refers to non-existing shared entry
When the split index feature is in use, then a cache entry is: - either only present in the split index, in which case its 'index' field must be 0, - or it should refer to an existing entry in the shared index, i.e. the 'index' field can't be greater than the size of the shared index. If a cache entry were to refer to a non-existing entry in the shared index, then that's a sign of something being wrong in the index state, either as a result of a bug in dealing with the split/shared index entries, or perhaps a (potentially unrelated) memory corruption issue. prepare_to_write_split_index() already has a condition to catch cache entries with such bogus 'index' field, but instead of calling BUG() it just sets cache entry's 'index = 0', and the entry will then be written to the new split index. Don't write a new index file from bogus index state, and call BUG() upon encountering an cache entry referring to a non-existing shared index entry. Running the test suite repeatedly with 'GIT_TEST_SPLIT_INDEX=yes' doesn't trigger this condition. Signed-off-by: SZEDER Gábor <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5581a01 commit 4c490f3

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

split-index.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,8 @@ void prepare_to_write_split_index(struct index_state *istate)
254254
continue;
255255
}
256256
if (ce->index > si->base->cache_nr) {
257-
ce->index = 0;
258-
continue;
257+
BUG("ce refers to a shared ce at %d, which is beyond the shared index size %d",
258+
ce->index, si->base->cache_nr);
259259
}
260260
ce->ce_flags |= CE_MATCHED; /* or "shared" */
261261
base = si->base->cache[ce->index - 1];

0 commit comments

Comments
 (0)