dir.c: free removed sparse-pattern hashmap entries
In add_pattern_to_hashsets(), we remove entries from the recursive_hashmap when adding similar ones to the parent_hashmap. I won't pretend to understand all of what's going on here, but there's an obvious leak: whatever we removed from recursive_hashmap is not referenced anywhere else, and is never free()d. We can easily fix this by asking the hashmap to return a pointer to the old entry. This makes t7002 now completely leak-free. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
db83b64cda
commit
4c844c2f49
8
dir.c
8
dir.c
@ -810,6 +810,8 @@ static void add_pattern_to_hashsets(struct pattern_list *pl, struct path_pattern
|
|||||||
|
|
||||||
if (given->patternlen > 2 &&
|
if (given->patternlen > 2 &&
|
||||||
!strcmp(given->pattern + given->patternlen - 2, "/*")) {
|
!strcmp(given->pattern + given->patternlen - 2, "/*")) {
|
||||||
|
struct pattern_entry *old;
|
||||||
|
|
||||||
if (!(given->flags & PATTERN_FLAG_NEGATIVE)) {
|
if (!(given->flags & PATTERN_FLAG_NEGATIVE)) {
|
||||||
/* Not a cone pattern. */
|
/* Not a cone pattern. */
|
||||||
warning(_("unrecognized pattern: '%s'"), given->pattern);
|
warning(_("unrecognized pattern: '%s'"), given->pattern);
|
||||||
@ -835,7 +837,11 @@ static void add_pattern_to_hashsets(struct pattern_list *pl, struct path_pattern
|
|||||||
}
|
}
|
||||||
|
|
||||||
hashmap_add(&pl->parent_hashmap, &translated->ent);
|
hashmap_add(&pl->parent_hashmap, &translated->ent);
|
||||||
hashmap_remove(&pl->recursive_hashmap, &translated->ent, &data);
|
old = hashmap_remove_entry(&pl->recursive_hashmap, translated, ent, &data);
|
||||||
|
if (old) {
|
||||||
|
free(old->pattern);
|
||||||
|
free(old);
|
||||||
|
}
|
||||||
free(data);
|
free(data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
test_description='git mv in sparse working trees'
|
test_description='git mv in sparse working trees'
|
||||||
|
|
||||||
|
TEST_PASSES_SANITIZE_LEAK=true
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
setup_sparse_checkout () {
|
setup_sparse_checkout () {
|
||||||
|
Loading…
Reference in New Issue
Block a user