Skip to content

Commit 21127fa

Browse files
committed
Merge branch 'tb/partial-clone-filters-fix'
Fix potential server side resource deallocation issues when responding to a partial clone request. * tb/partial-clone-filters-fix: upload-pack.c: don't free allowed_filters util pointers builtin/clone.c: don't ignore transport_fetch_refs() errors
2 parents 9feed4e + 8d133f5 commit 21127fa

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

builtin/clone.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,8 +1293,11 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
12931293
break;
12941294
}
12951295

1296-
if (!is_local && !complete_refs_before_fetch)
1297-
transport_fetch_refs(transport, mapped_refs);
1296+
if (!is_local && !complete_refs_before_fetch) {
1297+
err = transport_fetch_refs(transport, mapped_refs);
1298+
if (err)
1299+
goto cleanup;
1300+
}
12981301

12991302
remote_head = find_ref_by_name(refs, "HEAD");
13001303
remote_head_points_at =
@@ -1339,8 +1342,11 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
13391342

13401343
if (is_local)
13411344
clone_local(path, git_dir);
1342-
else if (refs && complete_refs_before_fetch)
1343-
transport_fetch_refs(transport, mapped_refs);
1345+
else if (refs && complete_refs_before_fetch) {
1346+
err = transport_fetch_refs(transport, mapped_refs);
1347+
if (err)
1348+
goto cleanup;
1349+
}
13441350

13451351
update_remote_refs(refs, mapped_refs, remote_head_points_at,
13461352
branch_top.buf, reflog_msg.buf, transport,
@@ -1367,6 +1373,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
13671373
junk_mode = JUNK_LEAVE_REPO;
13681374
err = checkout(submodule_progress);
13691375

1376+
cleanup:
13701377
free(remote_name);
13711378
strbuf_release(&reflog_msg);
13721379
strbuf_release(&branch_top);

t/t5616-partial-clone.sh

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,15 @@ test_expect_success 'upload-pack limits tree depth filters' '
289289
test_config -C srv.bare uploadpackfilter.tree.maxDepth 0 &&
290290
test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:1 \
291291
"file://$(pwd)/srv.bare" pc3 2>err &&
292-
test_i18ngrep "tree filter allows max depth 0, but got 1" err
292+
test_i18ngrep "tree filter allows max depth 0, but got 1" err &&
293+
294+
git clone --no-checkout --filter=tree:0 "file://$(pwd)/srv.bare" pc4 &&
295+
296+
test_config -C srv.bare uploadpackfilter.tree.maxDepth 5 &&
297+
git clone --no-checkout --filter=tree:5 "file://$(pwd)/srv.bare" pc5 &&
298+
test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:6 \
299+
"file://$(pwd)/srv.bare" pc6 2>err &&
300+
test_i18ngrep "tree filter allows max depth 5, but got 6" err
293301
'
294302

295303
test_expect_success 'partial clone fetches blobs pointed to by refs even if normally filtered out' '

upload-pack.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ static void upload_pack_data_clear(struct upload_pack_data *data)
156156
string_list_clear(&data->deepen_not, 0);
157157
object_array_clear(&data->extra_edge_obj);
158158
list_objects_filter_release(&data->filter_options);
159-
string_list_clear(&data->allowed_filters, 1);
159+
string_list_clear(&data->allowed_filters, 0);
160160

161161
free((char *)data->pack_objects_hook);
162162
}

0 commit comments

Comments
 (0)