From: Patrick Steinhardt Date: Thu, 5 Sep 2024 10:08:46 +0000 (+0200) Subject: builtin/push: fix leaking refspec query result X-Git-Tag: v2.47.0-rc0~28^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7eb6f02c554b2e41f4b33152163868a84a0afa85;p=thirdparty%2Fgit.git builtin/push: fix leaking refspec query result When appending a refspec via `refspec_append_mapped()` we leak the result of `query_refspecs()`. The overall logic around refspec queries is quite weird, as callers are expected to either set the `src` or `dst` pointers, and then the (allocated) result will be in the respective other struct member. As we have the `src` member set, plugging the memory leak is thus as easy as just freeing the `dst` member. While at it, use designated initializers to initialize the structure. This leak was exposed by t5516, but fixing it is not sufficient to make the whole test suite leak free. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/builtin/push.c b/builtin/push.c index 7a67398124..0b123eb9c1 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -72,13 +72,15 @@ static void refspec_append_mapped(struct refspec *refspec, const char *ref, const char *branch_name; if (remote->push.nr) { - struct refspec_item query; - memset(&query, 0, sizeof(struct refspec_item)); - query.src = matched->name; + struct refspec_item query = { + .src = matched->name, + }; + if (!query_refspecs(&remote->push, &query) && query.dst) { refspec_appendf(refspec, "%s%s:%s", query.force ? "+" : "", query.src, query.dst); + free(query.dst); return; } }