]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bisect: fix multiple leaks in `bisect_next_all()`
authorPatrick Steinhardt <ps@pks.im>
Wed, 20 Nov 2024 13:39:34 +0000 (14:39 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Nov 2024 23:23:41 +0000 (08:23 +0900)
There are multiple leaks in `bisect_next_all()`. For one we don't free
the `tried` commit list. Second, one of the branches uses a direct
return instead of jumping to the cleanup code.

Fix these by freeing the commit list and converting the return to a
goto.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
bisect.c

index 6dbc22f84fce11743f0e79eb4f8100c7ec07238f..04e9a63f11c7fa1a9dd11d3f193c500a4cb937c6 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -1031,7 +1031,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
 {
        struct strvec rev_argv = STRVEC_INIT;
        struct rev_info revs = REV_INFO_INIT;
-       struct commit_list *tried;
+       struct commit_list *tried = NULL;
        int reaches = 0, all = 0, nr, steps;
        enum bisect_error res = BISECT_OK;
        struct object_id *bisect_rev;
@@ -1098,7 +1098,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
        if (oideq(bisect_rev, current_bad_oid)) {
                res = error_if_skipped_commits(tried, current_bad_oid);
                if (res)
-                       return res;
+                       goto cleanup;
                printf("%s is the first %s commit\n", oid_to_hex(bisect_rev),
                        term_bad);
 
@@ -1132,6 +1132,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
 
        res = bisect_checkout(bisect_rev, no_checkout);
 cleanup:
+       free_commit_list(tried);
        release_revisions(&revs);
        strvec_clear(&rev_argv);
        return res;