From: "René Scharfe" <l.s.r@web.de>
To: Yongqiang Tian <yqtian668@gmail.com>, git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
Johannes Schindelin <johannes.schindelin@gmx.de>,
Johannes Sixt <j6t@kdbg.org>
Subject: Re: [PATCH] compat/winansi: fix die_lasterr() argument formatting
Date: Wed, 16 Sep 2026 08:33:19 +0200 [thread overview]
Message-ID: <bf0351d8-05fe-4f77-958a-2ac59495029c@web.de> (raw)
In-Reply-To: <20260916042312.35891-1-yqtian668@gmail.com>
On 9/16/26 6:23 AM, Yongqiang Tian wrote:
> During WinANSI initialization, duplicate_handle() reports the handle
> when DuplicateHandle() fails:
>
> die_lasterr("DuplicateHandle(%li) failed", ...);
>
> die_lasterr() collects the formatting arguments in a va_list, but
> passes that va_list to die_errno() as an ordinary variadic argument.
> die_errno() consequently formats the representation of the va_list
> instead of the supplied handle, producing an incorrect fatal message.
Good find!
> The other current callers pass fixed strings and are unaffected.
>
> Git does not provide a va_list-taking variant of die_errno(), so format
> the caller's arguments separately with strbuf_vaddf(). This consumes the
> original va_list correctly and produces the complete diagnostic prefix,
> including the handle supplied by duplicate_handle().
>
> Save GetLastError() before formatting because calls made while growing
> the strbuf may change the thread's Windows error value. Convert the
> saved value to errno only after formatting, then pass the completed
> message to die_errno() through a literal "%s". This prevents any percent
> characters in the formatted message from being interpreted a second
> time, while allowing die_errno() to append the corresponding system
> error and terminate as before.
That all makes sense, but is quite complicated. die_errno() itself uses
a fixed-size buffer to avoid heap allocation, for robustness and to
avoid changing errno. How about turning die_lasterr() into a macro for
the same reasons?
#define die_lasterr(...) do { \
errno = err_win_to_posix(GetLastError()); \
die_errno(__VA_ARGS__); \
} while (0)
> The updated compat/winansi.c compiles with MinGW GCC 13. A Win64 probe
> under Wine prints a value derived from the va_list before this change
> and the supplied integer afterward.
>
> Signed-off-by: Yongqiang Tian <yqtian668@gmail.com>
> ---
> compat/winansi.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/compat/winansi.c b/compat/winansi.c
> index 3ce190093..5547192a2 100644
> --- a/compat/winansi.c
> +++ b/compat/winansi.c
> @@ -7,6 +7,7 @@
> #define DISABLE_SIGN_COMPARE_WARNINGS
>
> #include "../git-compat-util.h"
> +#include "../strbuf.h"
> #include <wingdi.h>
> #include <winreg.h>
> #include "win32.h"
> @@ -438,11 +439,15 @@ static void winansi_exit(void)
>
> static void die_lasterr(const char *fmt, ...)
> {
> + DWORD err = GetLastError();
> + struct strbuf message = STRBUF_INIT;
> va_list params;
> +
> va_start(params, fmt);
> - errno = err_win_to_posix(GetLastError());
> - die_errno(fmt, params);
> + strbuf_vaddf(&message, fmt, params);
> va_end(params);
> + errno = err_win_to_posix(err);
> + die_errno("%s", message.buf);
> }
>
> #undef dup2
next prev parent reply other threads:[~2026-09-16 6:33 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-16 4:23 [PATCH] compat/winansi: fix die_lasterr() argument formatting Yongqiang Tian
2026-09-16 4:29 ` Junio C Hamano
2026-09-16 6:13 ` Johannes Sixt
2026-09-16 6:33 ` René Scharfe [this message]
2026-09-16 7:09 ` Johannes Sixt
2026-09-21 3:00 ` Yongqiang Tian
2026-09-21 4:06 ` Johannes Sixt
2026-09-21 6:20 ` [PATCH v2] " Yongqiang Tian
2026-09-21 17:18 ` Junio C Hamano
2026-09-21 23:49 ` Yongqiang Tian
2026-09-21 23:47 ` [PATCH v3] " Yongqiang Tian
2026-09-23 4:41 ` Johannes Sixt
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=bf0351d8-05fe-4f77-958a-2ac59495029c@web.de \
--to=l.s.r@web.de \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=johannes.schindelin@gmx.de \
--cc=ps@pks.im \
--cc=yqtian668@gmail.com \
/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.