match-trees: fix leaking prefixes in `shift_tree()`
In `shift_tree()` we allocate two empty strings that we end up passing to `match_trees()`. If that function finds a better match it will update these pointers to point to a newly allocated strings, freeing the old strings. We never free the final results though, neither the ones we have allocated ourselves, nor the one that `match_trees()` might've returned to us. Fix the resulting memory leaks by creating a common exit path where we free them. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
68bd0a94be
commit
2a01470891
|
@ -294,18 +294,22 @@ void shift_tree(struct repository *r,
|
||||||
unsigned short mode;
|
unsigned short mode;
|
||||||
|
|
||||||
if (!*del_prefix)
|
if (!*del_prefix)
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
if (get_tree_entry(r, hash2, del_prefix, shifted, &mode))
|
if (get_tree_entry(r, hash2, del_prefix, shifted, &mode))
|
||||||
die("cannot find path %s in tree %s",
|
die("cannot find path %s in tree %s",
|
||||||
del_prefix, oid_to_hex(hash2));
|
del_prefix, oid_to_hex(hash2));
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!*add_prefix)
|
if (!*add_prefix)
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
splice_tree(hash1, add_prefix, hash2, shifted);
|
splice_tree(hash1, add_prefix, hash2, shifted);
|
||||||
|
|
||||||
|
out:
|
||||||
|
free(add_prefix);
|
||||||
|
free(del_prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -5,6 +5,7 @@ test_description='subtree merge strategy'
|
||||||
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
||||||
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
||||||
|
|
||||||
|
TEST_PASSES_SANITIZE_LEAK=true
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
test_expect_success setup '
|
test_expect_success setup '
|
||||||
|
|
Loading…
Reference in New Issue