compat/winansi: fix die_lasterr() argument formatting
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. 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. Helped-by: Johannes Sixt <j6t@kdbg.org> Helped-by: René Scharfe <l.s.r@web.de> Signed-off-by: Yongqiang Tian <yqtian668@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>jch
parent
e9019fcafe
commit
79ac6eff39
|
|
@ -436,15 +436,6 @@ static void winansi_exit(void)
|
|||
CloseHandle(hthread);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#undef dup2
|
||||
int winansi_dup2(int oldfd, int newfd)
|
||||
{
|
||||
|
|
@ -462,8 +453,8 @@ static HANDLE duplicate_handle(HANDLE hnd)
|
|||
HANDLE hresult, hproc = GetCurrentProcess();
|
||||
if (!DuplicateHandle(hproc, hnd, hproc, &hresult, 0, TRUE,
|
||||
DUPLICATE_SAME_ACCESS))
|
||||
die_lasterr("DuplicateHandle(%li) failed",
|
||||
(long) (intptr_t) hnd);
|
||||
die("DuplicateHandle(%li) failed: %lu",
|
||||
(long) (intptr_t) hnd, GetLastError());
|
||||
return hresult;
|
||||
}
|
||||
|
||||
|
|
@ -609,16 +600,16 @@ void winansi_init(void)
|
|||
hwrite = CreateNamedPipeW(name, PIPE_ACCESS_OUTBOUND,
|
||||
PIPE_TYPE_BYTE | PIPE_WAIT, 1, BUFFER_SIZE, 0, 0, NULL);
|
||||
if (hwrite == INVALID_HANDLE_VALUE)
|
||||
die_lasterr("CreateNamedPipe failed");
|
||||
die("CreateNamedPipe failed: %lu", GetLastError());
|
||||
|
||||
hread = CreateFileW(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
|
||||
if (hread == INVALID_HANDLE_VALUE)
|
||||
die_lasterr("CreateFile for named pipe failed");
|
||||
die("CreateFile for named pipe failed: %lu", GetLastError());
|
||||
|
||||
/* start console spool thread on the pipe's read end */
|
||||
hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
|
||||
if (!hthread)
|
||||
die_lasterr("CreateThread(console_thread) failed");
|
||||
die("CreateThread(console_thread) failed: %lu", GetLastError());
|
||||
|
||||
/* schedule cleanup routine */
|
||||
if (atexit(winansi_exit))
|
||||
|
|
|
|||
Loading…
Reference in New Issue