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:
committed by
Junio C Hamano
parent
63494913ec
commit
e03004f7f8
34
send-pack.c
34
send-pack.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user