Thread (12 messages) 12 messages, 4 authors, 8d ago

Re: [PATCH v2] compat/winansi: fix die_lasterr() argument formatting

From: Yongqiang Tian <hidden>
Date: 2026-09-21 23:49:53

Hi Junio,

Thank you very much for the suggestion.
Unless the set-up to test this change needs some special care, we
usually do not write such a thing in our proposed log message.
Oh, I see. I'll follow this convention. I've moved the build validation
details below the separator in v3.
I would probably have added a Helped-by:
to credit j6t, though.
I've added Helped-by trailers for both Johannes Sixt and René Scharfe.
I'm grateful to both for their guidance on this fix.
Is that a change, meaning v1 was sent without building, linking and
testing?
Ah, sorry for the confusion. v1 was also compiled with MinGW and checked
with a Win64 probe under Wine. I should have listed the v2 validation
separately rather than under "Changes since v1".

I've sent v3 separately with these message updates and no code changes.

Thank you very much!

Thanks,
Yongqiang

On Tue, 22 Sept 2026 at 03:18, Junio C Hamano [off-list ref] wrote:
Yongqiang Tian [off-list ref] writes:
quoted
During WinANSI initialization, duplicate_handle() reports the handle
when DuplicateHandle() fails. 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 part of
the va_list representation instead of the supplied handle, producing
an incorrect fatal message.
Interesting.

It's a shame that nobody noticed the broken calling sequence since
the bogosity was first introduced into the codebase at eac14f8909
(Win32: Thread-safe windows console output, 2012-01-14).
quoted
The helper also converts GetLastError() to errno, losing the exact
Windows error code.

Remove die_lasterr() and report GetLastError() directly at its four
call sites, following the existing Windows diagnostic style. This
passes the handle to the formatter correctly and preserves the Windows
error code. Keep the existing %li representation of the handle.
OK.
quoted
With MinGW GCC 13, compat/winansi.o builds with DEVELOPER=1 and the
complete git.exe builds and links.
I am puzzled here.  What's the relevance of these two lines?

Are you telling us that how you have built and tested the patch?
Unless the set-up to test this change needs some special care, we
usually do not write such a thing in our proposed log message.
quoted
Signed-off-by: Yongqiang Tian <redacted>
---

Changes since v1:
- replace die_lasterr() with direct die() calls;
- preserve exact GetLastError() values instead of mapping them to errno;
- follow the existing Windows diagnostic style and retain %li for the
  handle;
Good collaboration.  If I were doing this commit, judging from the
discussion on v1 iteration, I would probably have added a Helped-by:
to credit j6t, though.
quoted
- verify compat/winansi.o with DEVELOPER=1 and build and link the
  complete git.exe with MinGW GCC 13.
Is that a change, meaning v1 was sent without building, linking and
testing?  Improving on that is a very welcome thing ;-).
quoted
 compat/winansi.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)
Nice.
quoted
-static void die_lasterr(const char *fmt, ...)
-{
-     va_list params;
-     va_start(params, fmt);
-     errno = err_win_to_posix(GetLastError());
-     die_errno(fmt, params);
-     va_end(params);
-}
Very good to see this go.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help