Skip to content

Commit

Permalink
read-cache: fix index corruption when using split index and version 4
Browse files Browse the repository at this point in the history
("read-cache: avoid allocating every ondisk entry when writing",
2017-08-21) changed the way cache entries are written to the index file.
While previously it wrote the name to an struct that was allocated using
xcalloc(), it now uses ce_write() directly. Previously ce_namelen -
common bytes were written to the cache entry, which would automatically
make it nul terminated, as it was allocated using calloc.

Now we are writing ce_namelen - common + 1 bytes directly from the
ce->name to the index. When CE_STRIP_NAME was set the ce_namelen was
being set to zero but then the + 1 was causing the first byte of the
ce->name to be written which was not a nul byte.

Fix that by only writing ce_namelen - common bytes directly from
ce->name to the index, and adding the nul terminator in an extra call to
ce_write.

This bug was turned up by setting TEST_GIT_INDEX_VERSION = 4 in
config.mak and running the test suite (t1700 specifically broke).

Signed-off-by: Kevin Willford <kewillf@microsoft.com>
  • Loading branch information
Kevin Willford authored and dscho committed Sep 6, 2017
1 parent 4b21f02 commit 7500e21
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -2172,7 +2172,9 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce,
if (!result)
result = ce_write(c, fd, to_remove_vi, prefix_size);
if (!result)
result = ce_write(c, fd, ce->name + common, ce_namelen(ce) - common + 1);
result = ce_write(c, fd, ce->name + common, ce_namelen(ce) - common);
if (!result)
result = ce_write(c, fd, padding, 1);

strbuf_splice(previous_name, common, to_remove,
ce->name + common, ce_namelen(ce) - common);
Expand Down

0 comments on commit 7500e21

Please sign in to comment.