{"thread":{"id":"63444","subject":"[PATCH] builtin/am: fix memory leak in `split_mail_stgit_series`","startedAt":"2025-05-12T02:07:30Z","lastAt":"2025-05-12T14:02:12Z","messageCount":3,"participants":["Lidong Yan via GitGitGadget","Patrick Steinhardt","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"517793","messageId":"pull.1961.git.git.1747015647505.gitgitgadget@gmail.com","threadId":"63444","inReplyTo":null,"subject":"[PATCH] builtin/am: fix memory leak in `split_mail_stgit_series`","fromName":"Lidong Yan via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2025-05-12T02:07:27Z","receivedAt":"2025-05-12T02:07:30Z","isPatch":true,"sender":{"key":"yldhome2d2@gmail.com","avatar":"https://avatars.githubusercontent.com/u/77328395?v=4"},"body":"From: Lidong Yan <502024330056@smail.nju.edu.cn>\n\nIn builtin/am.c:split_mail_stgit_series, if `fopen` failed,\n`series_dir_buf` allocated by `xstrdup` will leak. Add `free` in\n`!fp` if branch will prevent the leak.\n\nSigned-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>\n---\n    builtin/am: fix memory leak in split_mail_stgit_series\n    \n    In builtin/am.c:split_mail_stgit_series, if fopen failed, series_dir_buf\n    allocated by xstrdup will leak. Add free in !fp if branch will prevent\n    the leak.\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1961%2Fbrandb97%2Ffix-am-leak-v1\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1961/brandb97/fix-am-leak-v1\nPull-Request: https://github.com/git/git/pull/1961\n\n builtin/am.c | 4 +++-\n 1 file changed, 3 insertions(+), 1 deletion(-)\n\ndiff --git a/builtin/am.c b/builtin/am.c\nindex 4afb519830f..e32a3b4c973 100644\n--- a/builtin/am.c\n+++ b/builtin/am.c\n@@ -850,8 +850,10 @@ static int split_mail_stgit_series(struct am_state *state, const char **paths,\n \tseries_dir = dirname(series_dir_buf);\n \n \tfp = fopen(*paths, \"r\");\n-\tif (!fp)\n+\tif (!fp) {\n+\t\tfree(series_dir_buf);\n \t\treturn error_errno(_(\"could not open '%s' for reading\"), *paths);\n+\t}\n \n \twhile (!strbuf_getline_lf(&sb, fp)) {\n \t\tif (*sb.buf == '#')\n\nbase-commit: 6f84262c44a89851c3ae5a6e4c1a9d06b2068d75\n-- \ngitgitgadget\n"},{"id":"517802","messageId":"aCGs4nRjjHAs6aYu@pks.im","threadId":"63444","inReplyTo":"pull.1961.git.git.1747015647505.gitgitgadget@gmail.com","subject":"Re: [PATCH] builtin/am: fix memory leak in `split_mail_stgit_series`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2025-05-12T08:10:10Z","receivedAt":"2025-05-12T08:10:21Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Mon, May 12, 2025 at 02:07:27AM +0000, Lidong Yan via GitGitGadget wrote:\n> From: Lidong Yan <502024330056@smail.nju.edu.cn>\n> \n> In builtin/am.c:split_mail_stgit_series, if `fopen` failed,\n> `series_dir_buf` allocated by `xstrdup` will leak. Add `free` in\n> `!fp` if branch will prevent the leak.\n> \n> Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>\n\nThis fix looks obviously correct to me. Thanks!\n\nPatrick\n"},{"id":"517847","messageId":"xmqqikm6vsf3.fsf@gitster.g","threadId":"63444","inReplyTo":"pull.1961.git.git.1747015647505.gitgitgadget@gmail.com","subject":"Re: [PATCH] builtin/am: fix memory leak in `split_mail_stgit_series`","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2025-05-12T14:02:08Z","receivedAt":"2025-05-12T14:02:12Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Lidong Yan via GitGitGadget\" <gitgitgadget@gmail.com> writes:\n\n> From: Lidong Yan <502024330056@smail.nju.edu.cn>\n>\n> In builtin/am.c:split_mail_stgit_series, if `fopen` failed,\n> `series_dir_buf` allocated by `xstrdup` will leak. Add `free` in\n> `!fp` if branch will prevent the leak.\n>\n> diff --git a/builtin/am.c b/builtin/am.c\n> index 4afb519830f..e32a3b4c973 100644\n> --- a/builtin/am.c\n> +++ b/builtin/am.c\n> @@ -850,8 +850,10 @@ static int split_mail_stgit_series(struct am_state *state, const char **paths,\n>  \tseries_dir = dirname(series_dir_buf);\n>  \n>  \tfp = fopen(*paths, \"r\");\n> -\tif (!fp)\n> +\tif (!fp) {\n> +\t\tfree(series_dir_buf);\n>  \t\treturn error_errno(_(\"could not open '%s' for reading\"), *paths);\n> +\t}\n>  \n>  \twhile (!strbuf_getline_lf(&sb, fp)) {\n>  \t\tif (*sb.buf == '#')\n>\n> base-commit: 6f84262c44a89851c3ae5a6e4c1a9d06b2068d75\n\nObviously correct; will queue.  Thanks.\n"}]}