From 76e7f4ec485f24b167b76db046dc2ca4562debd4 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 10 Apr 2005 22:06:50 -0700 Subject: [PATCH] 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. --- read-cache.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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; -- 2.11.0