send-pack: fix leaking common object IDs

We're leaking the array of common object IDs in `send_pack()`. Fix this
by creating a common exit path where we free the leaking data. While at
it, unify some other cleanups now that we have a central place to put
them.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2024-09-05 12:08:43 +02:00
committed by Junio C Hamano
parent 63494913ec
commit e03004f7f8
2 changed files with 23 additions and 12 deletions

View File

@@ -508,7 +508,8 @@ int send_pack(struct send_pack_args *args,
if (!remote_refs) { if (!remote_refs) {
fprintf(stderr, "No refs in common and none specified; doing nothing.\n" fprintf(stderr, "No refs in common and none specified; doing nothing.\n"
"Perhaps you should specify a branch.\n"); "Perhaps you should specify a branch.\n");
return 0; ret = 0;
goto out;
} }
git_config_get_bool("push.negotiate", &push_negotiate); git_config_get_bool("push.negotiate", &push_negotiate);
@@ -615,12 +616,11 @@ int send_pack(struct send_pack_args *args,
* atomically, abort the whole operation. * atomically, abort the whole operation.
*/ */
if (use_atomic) { if (use_atomic) {
strbuf_release(&req_buf);
strbuf_release(&cap_buf);
reject_atomic_push(remote_refs, args->send_mirror); reject_atomic_push(remote_refs, args->send_mirror);
error("atomic push failed for ref %s. status: %d\n", error("atomic push failed for ref %s. status: %d\n",
ref->name, ref->status); ref->name, ref->status);
return args->porcelain ? 0 : -1; ret = args->porcelain ? 0 : -1;
goto out;
} }
/* else fallthrough */ /* else fallthrough */
default: default:
@@ -682,8 +682,6 @@ int send_pack(struct send_pack_args *args,
write_or_die(out, req_buf.buf, req_buf.len); write_or_die(out, req_buf.buf, req_buf.len);
packet_flush(out); packet_flush(out);
} }
strbuf_release(&req_buf);
strbuf_release(&cap_buf);
if (use_sideband && cmds_sent) { if (use_sideband && cmds_sent) {
memset(&demux, 0, sizeof(demux)); memset(&demux, 0, sizeof(demux));
@@ -721,7 +719,9 @@ int send_pack(struct send_pack_args *args,
finish_async(&demux); finish_async(&demux);
} }
fd[1] = -1; fd[1] = -1;
return -1;
ret = -1;
goto out;
} }
if (!args->stateless_rpc) if (!args->stateless_rpc)
/* Closed by pack_objects() via start_command() */ /* Closed by pack_objects() via start_command() */
@@ -746,10 +746,12 @@ int send_pack(struct send_pack_args *args,
} }
if (ret < 0) if (ret < 0)
return ret; goto out;
if (args->porcelain) if (args->porcelain) {
return 0; ret = 0;
goto out;
}
for (ref = remote_refs; ref; ref = ref->next) { for (ref = remote_refs; ref; ref = ref->next) {
switch (ref->status) { switch (ref->status) {
@@ -758,8 +760,16 @@ int send_pack(struct send_pack_args *args,
case REF_STATUS_OK: case REF_STATUS_OK:
break; break;
default: default:
return -1; ret = -1;
goto out;
} }
} }
return 0;
ret = 0;
out:
oid_array_clear(&commons);
strbuf_release(&req_buf);
strbuf_release(&cap_buf);
return ret;
} }

View File

@@ -5,6 +5,7 @@ test_description='fetch/push functionality using the HTTP protocol'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-httpd.sh . "$TEST_DIRECTORY"/lib-httpd.sh
start_httpd start_httpd