send-pack: free cas options before exit

The send-pack --force-with-lease option populates a push_cas_option
struct with allocated strings. Exiting without cleaning this up will
cause leak-checkers to complain.

We can fix this by calling clear_cas_option(), after making it publicly
available. Previously it was used only for resetting the list when we
saw --no-force-with-lease.

The git-push command has the same "leak", though in this case it won't
trigger a leak-checker since it stores the push_cas_option struct as a
global rather than on the stack (and is thus reachable even after main()
exits). I've added cleanup for it here anyway, though, as
future-proofing.

The leak is triggered by t5541 (it tests --force-with-lease over http,
which requires a separate send-pack process under the hood), but we
can't mark it as leak-free yet.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King
2024-09-24 17:55:39 -04:00
committed by Junio C Hamano
parent 753f6708d0
commit 05372c28be
4 changed files with 4 additions and 1 deletions

View File

@ -669,6 +669,7 @@ int cmd_push(int argc,
rc = do_push(flags, push_options, remote);
string_list_clear(&push_options_cmdline, 0);
string_list_clear(&push_options_config, 0);
clear_cas_option(&cas);
if (rc == -1)
usage_with_options(push_usage, options);
else

View File

@ -344,5 +344,6 @@ int cmd_send_pack(int argc,
free_refs(local_refs);
refspec_clear(&rs);
oid_array_clear(&shallow);
clear_cas_option(&cas);
return ret;
}

View File

@ -2544,7 +2544,7 @@ struct ref *get_stale_heads(struct refspec *rs, struct ref *fetch_map)
/*
* Compare-and-swap
*/
static void clear_cas_option(struct push_cas_option *cas)
void clear_cas_option(struct push_cas_option *cas)
{
int i;

View File

@ -409,6 +409,7 @@ struct push_cas_option {
};
int parseopt_push_cas_option(const struct option *, const char *arg, int unset);
void clear_cas_option(struct push_cas_option *);
int is_empty_cas(const struct push_cas_option *);
void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *);