diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-10 22:06:50 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-10 22:06:50 -0700 |
commit | 76e7f4ec485f24b167b76db046dc2ca4562debd4 (patch) | |
tree | 3d00c15360e1aea2a51558e5f56b95d11e9d7010 /read-cache.c | |
parent | 262e82b4a7ec708d8c9e641421509b16b8ec69f1 (diff) | |
download | git-76e7f4ec485f24b167b76db046dc2ca4562debd4.tar.gz |
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.
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/read-cache.c b/read-cache.c index 53da50065d..51403cea19 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; |