diff options
author | Junio C Hamano <gitster@pobox.com> | 2022-01-12 15:11:43 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-01-12 15:11:43 -0800 |
commit | 12f82b0dd70aaefdb9363a96403d41d13b97e5b0 (patch) | |
tree | d2de6d99648f1901c8b72c1fbbe7744aeade71f4 /transport.c | |
parent | 453cef74556652c5ecdc840744fa352005bb3152 (diff) | |
parent | 58d4d7f1c5a665111f05c61901a11a555703fe11 (diff) | |
download | git-12f82b0dd70aaefdb9363a96403d41d13b97e5b0.tar.gz |
Merge branch 'ps/lockfile-cleanup-fix'
Some lockfile code called free() in signal-death code path, which
has been corrected.
* ps/lockfile-cleanup-fix:
fetch: fix deadlock when cleaning up lockfiles in async signals
Diffstat (limited to 'transport.c')
-rw-r--r-- | transport.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/transport.c b/transport.c index 92ab9a3fa6..2a3e324154 100644 --- a/transport.c +++ b/transport.c @@ -1456,13 +1456,18 @@ int transport_fetch_refs(struct transport *transport, struct ref *refs) return rc; } -void transport_unlock_pack(struct transport *transport) +void transport_unlock_pack(struct transport *transport, unsigned int flags) { + int in_signal_handler = !!(flags & TRANSPORT_UNLOCK_PACK_IN_SIGNAL_HANDLER); int i; for (i = 0; i < transport->pack_lockfiles.nr; i++) - unlink_or_warn(transport->pack_lockfiles.items[i].string); - string_list_clear(&transport->pack_lockfiles, 0); + if (in_signal_handler) + unlink(transport->pack_lockfiles.items[i].string); + else + unlink_or_warn(transport->pack_lockfiles.items[i].string); + if (!in_signal_handler) + string_list_clear(&transport->pack_lockfiles, 0); } int transport_connect(struct transport *transport, const char *name, |