From: Keith Packard Date: Wed, 3 Oct 2007 05:44:15 +0000 (-0700) Subject: Must not modify the_index.cache as it may be passed to realloc at some point. X-Git-Tag: v1.5.3.4~2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=95af39fcb2d84c8ef2844a9d890e3c67a2e0e1ec;p=git.git Must not modify the_index.cache as it may be passed to realloc at some point. The index cache is not static, growing as new entries are added. If entries are added after prune_cache is called, cache will no longer point at the base of the allocation, and realloc will not be happy. I verified that this was the only place in the current source which modified any index_state.cache elements aside from the alloc/realloc calls in read-cache by changing the type of the element to 'struct cache_entry ** const cache' and recompiling. A more efficient patch would create a separate 'cache_base' value to track the allocation and then fix things up when reallocation was necessary, instead of the brute-force memmove used here. Signed-off-by: Junio C Hamano --- diff --git a/builtin-ls-files.c b/builtin-ls-files.c index 6c1db86e8..171d44904 100644 --- a/builtin-ls-files.c +++ b/builtin-ls-files.c @@ -280,7 +280,8 @@ static void prune_cache(const char *prefix) if (pos < 0) pos = -pos-1; - active_cache += pos; + memmove(active_cache, active_cache + pos, + (active_nr - pos) * sizeof(struct cache_entry *)); active_nr -= pos; first = 0; last = active_nr;