entry: fix leaking pathnames during delayed checkout
When filtering files during delayed checkout, we pass a string list to `async_query_available_blobs()`. This list is initialized with NODUP, and thus inserted strings will not be owned by the list. In the latter function we then try to hand over ownership by passing an `xstrup()`'d value to `string_list_insert()`. But this is not how this works: a NODUP list does not take ownership of allocated strings and will never free them for the caller. Fix this issue by initializing the list as `DUP` instead and dropping the explicit call to `xstrdup()`. This is okay to do given that this is the single callsite of `async_query_available_blobs()`. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Aug 1, 2024 at 12:41 UTC
1f0899978109d732abe5b4825b5cfa40ef1d5885
4 files changed
+6
-2
convert.c
+1
-1
@@ -960,7 +960,7 @@ int async_query_available_blobs(const char *cmd, struct string_list *available_p
960
while ((line = packet_read_line(process->out, NULL))) {
961
const char *path;
962
if (skip_prefix(line, "pathname=", &path))
963
- string_list_insert(available_paths, xstrdup(path));
963
+ string_list_insert(available_paths, path);
964
else
965
; /* ignore unknown keys */
966
}
entry.c
+3
-1
@@ -191,7 +191,7 @@ int finish_delayed_checkout(struct checkout *state, int show_progress)
191
progress = start_delayed_progress(_("Filtering content"), dco->paths.nr);
192
while (dco->filters.nr > 0) {
193
for_each_string_list_item(filter, &dco->filters) {
194
- struct string_list available_paths = STRING_LIST_INIT_NODUP;
194
+ struct string_list available_paths = STRING_LIST_INIT_DUP;
195
196
if (!async_query_available_blobs(filter->string, &available_paths)) {
197
/* Filter reported an error */
@@ -245,6 +245,8 @@ int finish_delayed_checkout(struct checkout *state, int show_progress)
245
} else
246
errs = 1;
247
}
248
+
249
+ string_list_clear(&available_paths, 0);
250
}
251
252
filter_string_list(&dco->filters, 0, string_is_not_null, NULL);
t/t2080-parallel-checkout-basics.sh
+1
@@ -8,6 +8,7 @@ working tree.
8
'
9
10
TEST_NO_CREATE_REPO=1
11
+TEST_PASSES_SANITIZE_LEAK=true
12
. ./test-lib.sh
13
. "$TEST_DIRECTORY/lib-parallel-checkout.sh"
14
t/t2082-parallel-checkout-attributes.sh
+1
@@ -10,6 +10,7 @@ properly (without access to the index or attribute stack).
10
'
11
12
TEST_NO_CREATE_REPO=1
13
+TEST_PASSES_SANITIZE_LEAK=true
14
. ./test-lib.sh
15
. "$TEST_DIRECTORY/lib-parallel-checkout.sh"
16
. "$TEST_DIRECTORY/lib-encoding.sh"