[PATCH 09/11] branch: fix a leak in setup_tracking
- From
Rubén Justo <rjusto@gmail.com>
- Date
- Jun 11, 2023, 18:50 UTC
- Message-ID
- <471dcc04-d60c-b745-15f0-05fe4e93ff11@gmail.com>
- In-Reply-To
- <9eb931e7-dd18-8ce8-4d4a-cf3d85066189@gmail.com>
The commit d3115660b4 (branch: add flags and config to inherit tracking, 2021-12-20) replaced in "struct tracking", the member "char *src" by a new "struct string_list *srcs".
This caused a modification in find_tracked_branch(). The string returned by remote_find_tracking(), previously assigned to "src", is now added to the string_list "srcs".
That string_list is initialized with STRING_LIST_INIT_DUP, which means that what is added is not the given string, but a duplicate. Therefore, the string returned by remote_find_tracking() is leaked.
The leak can be reviewed with:
$ git branch foo $ git remote add local . $ git fetch local $ git branch --track bar local/foo
Direct leak of 24 byte(s) in 1 object(s) allocated from:
... in xrealloc wrapper.c
... in strbuf_grow strbuf.c
... in strbuf_add strbuf.c
... in match_name_with_pattern remote.c
... in query_refspecs remote.c
... in remote_find_tracking remote.c
... in find_tracked_branch branch.c
... in for_each_remote remote.c
... in setup_tracking branch.c
... in create_branch branch.c
... in cmd_branch builtin/branch.c
... in run_builtin git.cLet's fix the leak, using the "_nodup" API to add to the string_list. This way, the string itself will be added instead of being strdup()'d. And when the string_list is cleared, the string will be freed.
Signed-off-by: Rubén Justo <rjusto@gmail.com> --- branch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/branch.c b/branch.c index 09b9563ae7..d88f50a48a 100644 --- a/branch.c +++ b/branch.c @@ -37,7 +37,7 @@ static int find_tracked_branch(struct remote *remote, void *priv) if (!remote_find_tracking(remote, &tracking->spec)) { switch (++tracking->matches) { case 1: - string_list_append(tracking->srcs, tracking->spec.src); + string_list_append_nodup(tracking->srcs, tracking->spec.src); tracking->remote = remote->name; break; case 2:
-- 2.40.1