From: Patrick Steinhardt <ps@pks.im>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: Re: [PATCH] history: streamline message preparation and plug file stream leak
Date: Mon, 29 Jun 2026 08:33:18 +0200 [thread overview]
Message-ID: <akIRrmD4Tqp-Gi9d@pks.im> (raw)
In-Reply-To: <xmqqecht8df1.fsf@gitster.g>
On Fri, Jun 26, 2026 at 09:38:42AM -0700, Junio C Hamano wrote:
> diff --git a/builtin/history.c b/builtin/history.c
> index 8dcb9a6046..f17ec049c0 100644
> --- a/builtin/history.c
> +++ b/builtin/history.c
> @@ -41,11 +41,6 @@ static int fill_commit_message(struct repository *repo,
> " empty message aborts the commit.\n");
> struct wt_status s;
>
> - strbuf_addstr(out, default_message);
> - strbuf_addch(out, '\n');
> - strbuf_commented_addf(out, comment_line_str, hint, action, comment_line_str);
> - write_file_buf(path, out->buf, out->len);
> -
> wt_status_prepare(repo, &s);
> FREE_AND_NULL(s.branch);
> s.ahead_behind_flags = AHEAD_BEHIND_QUICK;
> @@ -57,14 +52,20 @@ static int fill_commit_message(struct repository *repo,
> s.whence = FROM_COMMIT;
> s.committable = 1;
>
> - s.fp = fopen(git_path_commit_editmsg(), "a");
Here we reuse the local `path` variable, which already carries the
result of `git_path_commit_editmsg()`.
> + s.fp = fopen(path, "w");
> if (!s.fp)
> - return error_errno(_("could not open '%s'"), git_path_commit_editmsg());
> + return error_errno(_("could not open '%s'"), path);
Likewise.
> + strbuf_addstr(out, default_message);
> + strbuf_addch(out, '\n');
> + strbuf_commented_addf(out, comment_line_str, hint, action, comment_line_str);
> + fwrite(out->buf, 1, out->len, s.fp);
>
> wt_status_collect_changes_trees(&s, old_tree, new_tree);
> wt_status_print(&s);
> wt_status_collect_free_buffers(&s);
> string_list_clear_func(&s.change, change_data_free);
> + fclose(s.fp);
This is fixing the leaked file descriptor.
One thing I wonder though is that we don't perform any error checking on
the file in the new version. Previously, we would have died in case
`write_file_buf()` failed. But now we just `fwrite()` without error
checking. I don't think that "wt-status.c" does error checking either,
so we might end up with a partially-written file without us noticing.
Thanks!
Patrick
next prev parent reply other threads:[~2026-06-29 6:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-26 16:38 [PATCH] history: streamline message preparation and plug file stream leak Junio C Hamano
2026-06-29 6:33 ` Patrick Steinhardt [this message]
2026-06-29 15:21 ` Junio C Hamano
2026-06-29 16:04 ` Patrick Steinhardt
2026-06-29 16:08 ` [PATCH v2] " Junio C Hamano
2026-06-30 12:24 ` Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=akIRrmD4Tqp-Gi9d@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.