From: Linus Torvalds Date: Mon, 11 Apr 2005 05:06:50 +0000 (-0700) Subject: Fix off-by-one error in removal of cache entry. X-Git-Tag: v0.99~925 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=76e7f4ec485f24b167b76db046dc2ca4562debd4;p=git.git Fix off-by-one error in removal of cache entry. Also make the return value of "cache_name_pos()" be sane: positive or zero if we found it (it's the index into the cache array), and "-pos-1" to indicate where it should go if we didn't. --- diff --git a/read-cache.c b/read-cache.c index 53da50065..51403cea1 100644 --- a/read-cache.c +++ b/read-cache.c @@ -276,24 +276,23 @@ int cache_name_pos(const char *name, int namelen) struct cache_entry *ce = active_cache[next]; int cmp = cache_name_compare(name, namelen, ce->name, ce->namelen); if (!cmp) - return -next-1; + return next; if (cmp < 0) { last = next; continue; } first = next+1; } - return first; + return -first-1; } int remove_file_from_cache(char *path) { int pos = cache_name_pos(path, strlen(path)); - if (pos < 0) { - pos = -pos-1; + if (pos >= 0) { active_nr--; if (pos < active_nr) - memmove(active_cache + pos, active_cache + pos + 1, (active_nr - pos - 1) * sizeof(struct cache_entry *)); + memmove(active_cache + pos, active_cache + pos + 1, (active_nr - pos) * sizeof(struct cache_entry *)); } return 0; } @@ -305,10 +304,11 @@ int add_cache_entry(struct cache_entry *ce, int ok_to_add) pos = cache_name_pos(ce->name, ce->namelen); /* existing match? Just replace it */ - if (pos < 0) { - active_cache[-pos-1] = ce; + if (pos >= 0) { + active_cache[pos] = ce; return 0; } + pos = -pos-1; if (!ok_to_add) return -1;