Message ID | 088f730572f0f5aaa8f9640ea35a4687be9094ba.1721995576.git.ps@pks.im (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Memory leak fixes (pt.3) | expand |
Patrick Steinhardt <ps@pks.im> writes: > There are several structures that we don't release after > `cmd_name_rev()` is done. Plug those leaks. > > Signed-off-by: Patrick Steinhardt <ps@pks.im> > --- > builtin/name-rev.c | 6 ++++-- > t/t6007-rev-list-cherry-pick-file.sh | 1 + > t/t6120-describe.sh | 1 + > 3 files changed, 6 insertions(+), 2 deletions(-) > > diff --git a/builtin/name-rev.c b/builtin/name-rev.c > index 70e9ec4e47..f62c0a36cb 100644 > --- a/builtin/name-rev.c > +++ b/builtin/name-rev.c > @@ -677,7 +677,9 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix) > always, allow_undefined, data.name_only); > } > > - UNLEAK(string_pool); > - UNLEAK(revs); > + string_list_clear(&data.ref_filters, 0); > + string_list_clear(&data.exclude_filters, 0); > + mem_pool_discard(&string_pool, 0); > + object_array_clear(&revs); > return 0; > } You, originally these "we know we are at the very end of the process, so _exit() will take care of releasing the resources" was a very much deliberate, and in a sense, cmd_describe() calling to this function as the last thing to do was still in the same spirit, but it was not a hygiene thing to do. In the longer term, we would want to make a major part of the body of this "main" function into a reusable library-ish function, which will be called the desribe and name-rev command implementations, and when that happens, these fixes would move together to that library-ish function. Looking good.
diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 70e9ec4e47..f62c0a36cb 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -677,7 +677,9 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix) always, allow_undefined, data.name_only); } - UNLEAK(string_pool); - UNLEAK(revs); + string_list_clear(&data.ref_filters, 0); + string_list_clear(&data.exclude_filters, 0); + mem_pool_discard(&string_pool, 0); + object_array_clear(&revs); return 0; } diff --git a/t/t6007-rev-list-cherry-pick-file.sh b/t/t6007-rev-list-cherry-pick-file.sh index 6f3e543977..2d337d7287 100755 --- a/t/t6007-rev-list-cherry-pick-file.sh +++ b/t/t6007-rev-list-cherry-pick-file.sh @@ -5,6 +5,7 @@ test_description='test git rev-list --cherry-pick -- file' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # A---B---D---F diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh index 79e0f19deb..05ed2510d9 100755 --- a/t/t6120-describe.sh +++ b/t/t6120-describe.sh @@ -14,6 +14,7 @@ test_description='test describe' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh check_describe () {
There are several structures that we don't release after `cmd_name_rev()` is done. Plug those leaks. Signed-off-by: Patrick Steinhardt <ps@pks.im> --- builtin/name-rev.c | 6 ++++-- t/t6007-rev-list-cherry-pick-file.sh | 1 + t/t6120-describe.sh | 1 + 3 files changed, 6 insertions(+), 2 deletions(-)