]> git.ipfire.org Git - thirdparty/git.git/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 e6f48969b81a06f22b6a64e6c72fa91cd85805b6..59d4485603a3862548267d5b696feca61343237f 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 c49fe6c53cc8ad3033181dabad7b97cccb0f2d7e..8b1d46e79a8724ac0d33999c184227ad440880a3 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 390a03c2643db61fcfd2f994eb12d3d27c5b4633..e291e8ff5cddb25e35063be74097b1965b27000e 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 a58713f20ad654bc2ce441f67d39c315b12541bf..ad4513f6394bed26561bf0de918d0e2e827de28c 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 *);