diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-01-31 13:14:58 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-01-31 13:14:59 -0800 |
commit | c54ba283fa4501cc02230424ccfd84622df49256 (patch) | |
tree | 616ea27040da3f9b556badfa5304237c7e5325ad | |
parent | Merge branch 'st/verify-tag' (diff) | |
parent | clear_delta_base_cache(): don't modify hashmap while iterating (diff) | |
download | tgif-c54ba283fa4501cc02230424ccfd84622df49256.tar.xz |
Merge branch 'jk/clear-delta-base-cache-fix'
A crashing bug introduced in v2.11 timeframe has been found (it is
triggerable only in fast-import) and fixed.
* jk/clear-delta-base-cache-fix:
clear_delta_base_cache(): don't modify hashmap while iterating
-rw-r--r-- | Documentation/technical/api-hashmap.txt | 4 | ||||
-rw-r--r-- | sha1_file.c | 9 |
2 files changed, 7 insertions, 6 deletions
diff --git a/Documentation/technical/api-hashmap.txt b/Documentation/technical/api-hashmap.txt index 28f5a8b715..a3f020cd9e 100644 --- a/Documentation/technical/api-hashmap.txt +++ b/Documentation/technical/api-hashmap.txt @@ -188,7 +188,9 @@ Returns the removed entry, or NULL if not found. `void *hashmap_iter_next(struct hashmap_iter *iter)`:: `void *hashmap_iter_first(struct hashmap *map, struct hashmap_iter *iter)`:: - Used to iterate over all entries of a hashmap. + Used to iterate over all entries of a hashmap. Note that it is + not safe to add or remove entries to the hashmap while + iterating. + `hashmap_iter_init` initializes a `hashmap_iter` structure. + diff --git a/sha1_file.c b/sha1_file.c index c40ef7111c..ec957db5e1 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2371,11 +2371,10 @@ static inline void release_delta_base_cache(struct delta_base_cache_entry *ent) void clear_delta_base_cache(void) { - struct hashmap_iter iter; - struct delta_base_cache_entry *entry; - for (entry = hashmap_iter_first(&delta_base_cache, &iter); - entry; - entry = hashmap_iter_next(&iter)) { + struct list_head *lru, *tmp; + list_for_each_safe(lru, tmp, &delta_base_cache_lru) { + struct delta_base_cache_entry *entry = + list_entry(lru, struct delta_base_cache_entry, lru); release_delta_base_cache(entry); } } |