]> Kevux Git Server - rit/commitdiff
send-pack: free cas options before exit
authorJeff King <peff@peff.net>
Tue, 24 Sep 2024 21:55:39 +0000 (17:55 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Sep 2024 17:24:53 +0000 (10:24 -0700)
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>
builtin/push.c
builtin/send-pack.c
remote.c
remote.h

index e6f4896..59d4485 100644 (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
index c49fe6c..8b1d46e 100644 (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;
 }
index 390a03c..e291e8f 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -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;
 
index a58713f..ad4513f 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -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 *);