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' '