merge-file: fix memory leaks on error path

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>

Ævar Arnfjörð Bjarmason committed Jul 1, 2022 at 12:42 UTC e72e12cc02d80e4ebf01e0a3d170617211ae7c70
2 files changed +8 -4
builtin/merge-file.c
+6 -4
@@ -87,7 +87,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
87
88 free(fname);
89 if (ret)
90 - return ret;
90 + goto cleanup;
91 +
92 }
93
94 xmp.ancestor = names[1];
@@ -95,9 +96,6 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
96 xmp.file2 = names[2];
97 ret = xdl_merge(mmfs + 1, mmfs + 0, mmfs + 2, &xmp, &result);
98
98 - for (i = 0; i < 3; i++)
99 - free(mmfs[i].ptr);
100 -
99 if (ret >= 0) {
100 const char *filename = argv[0];
101 char *fpath = prefix_filename(prefix, argv[0]);
@@ -118,5 +116,9 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
116 if (ret > 127)
117 ret = 127;
118
119 +cleanup:
120 + for (i = 0; i < 3; i++)
121 + free(mmfs[i].ptr);
122 +
123 return ret;
124 }
t/t6403-merge-file.sh
+2
@@ -1,6 +1,8 @@
1 #!/bin/sh
2
3 test_description='RCS merge replacement: merge-file'
4 +
5 +TEST_PASSES_SANITIZE_LEAK=true
6 . ./test-lib.sh
7
8 test_expect_success 'setup' '