]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-file: fix memory leaks on error path
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Fri, 1 Jul 2022 10:42:56 +0000 (12:42 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 1 Jul 2022 18:43:43 +0000 (11:43 -0700)
Fix a memory leak in "merge-file", we need to loop over the "mmfs"
array and free() what we've got so far when we error out. As a result
we can mark a test as passing with SANITIZE=leak using
"TEST_PASSES_SANITIZE_LEAK=true".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge-file.c
t/t6403-merge-file.sh

index 793817f3cb9bca482a6323c4d3a9a34f773357f2..c923bbf2abbdfa9d8a5461fcf5c0402a341a061b 100644 (file)
@@ -87,7 +87,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
 
                free(fname);
                if (ret)
-                       return ret;
+                       goto cleanup;
+
        }
 
        xmp.ancestor = names[1];
@@ -95,9 +96,6 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
        xmp.file2 = names[2];
        ret = xdl_merge(mmfs + 1, mmfs + 0, mmfs + 2, &xmp, &result);
 
-       for (i = 0; i < 3; i++)
-               free(mmfs[i].ptr);
-
        if (ret >= 0) {
                const char *filename = argv[0];
                char *fpath = prefix_filename(prefix, argv[0]);
@@ -118,5 +116,9 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
        if (ret > 127)
                ret = 127;
 
+cleanup:
+       for (i = 0; i < 3; i++)
+               free(mmfs[i].ptr);
+
        return ret;
 }
index 2f421d967abefbef96eb6f2c0d1201184b9b5d57..1a7082323dddfce66b2d419efe60c87314c5f8e1 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='RCS merge replacement: merge-file'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '