Fix close(1) bug on Windows

This commit is contained in:
Justine Tunney 2023-07-28 03:56:56 -07:00
parent 83341a4269
commit b0e3258709
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
6 changed files with 51 additions and 7 deletions

View file

@ -44,20 +44,20 @@ unsigned __wincrash(struct NtExceptionPointers *ep) {
static bool noreentry;
noreentry = true;
STRACE("wincrash rip %x bt %s", ep->ContextRecord->Rip,
DescribeBacktrace((struct StackFrame *)ep->ContextRecord->Rbp));
if ((tib = __tls_enabled ? __get_tls_privileged() : 0)) {
if (~tib->tib_flags & TIB_FLAG_WINCRASHING) {
tib->tib_flags |= TIB_FLAG_WINCRASHING;
} else {
WincrashPanic:
STRACE("panic: wincrash reentry: rip %x bt %s", ep->ContextRecord->Rip,
DescribeBacktrace((struct StackFrame *)ep->ContextRecord->Rbp));
ExitProcess(89);
}
} else {
if (!noreentry) {
noreentry = true;
} else {
goto WincrashPanic;
ExitProcess(89);
}
}

View file

@ -104,7 +104,7 @@ static dontasan void Print(const char *prologue) {
*
* @param prologue needs to be a .rodata kprintf string
*/
textstartup void __printargs(const char *prologue) {
dontasan textstartup void __printargs(const char *prologue) {
const struct AuxiliaryValue {
const char *fmt;

View file

@ -20,6 +20,7 @@
#include "libc/calls/syscall_support-nt.internal.h"
#include "libc/dce.h"
#include "libc/intrin/describeflags.internal.h"
#include "libc/intrin/kprintf.h"
#include "libc/intrin/strace.internal.h"
#include "libc/intrin/weaken.h"
#include "libc/log/libfatal.internal.h"
@ -29,6 +30,7 @@
#include "libc/nt/enum/consolemodeflags.h"
#include "libc/nt/enum/filemapflags.h"
#include "libc/nt/enum/pageflags.h"
#include "libc/nt/files.h"
#include "libc/nt/memory.h"
#include "libc/nt/pedef.internal.h"
#include "libc/nt/process.h"
@ -123,6 +125,18 @@ __msabi static textwindows int OnEarlyWinCrash(struct NtExceptionPointers *ep) {
ExitProcess(200);
}
__msabi static textwindows void DeduplicateStdioHandles(void) {
int64_t proc, outhand, errhand, newhand;
outhand = GetStdHandle(kNtStdOutputHandle);
errhand = GetStdHandle(kNtStdErrorHandle);
if (outhand == errhand) {
proc = GetCurrentProcess();
DuplicateHandle(proc, errhand, proc, &newhand, 0, true,
kNtDuplicateSameAccess);
SetStdHandle(kNtStdErrorHandle, newhand);
}
}
__msabi static textwindows wontreturn void WinMainNew(const char16_t *cmdline) {
bool32 rc;
int64_t h, hand;
@ -136,6 +150,7 @@ __msabi static textwindows wontreturn void WinMainNew(const char16_t *cmdline) {
intptr_t stackaddr, allocaddr;
version = NtGetPeb()->OSMajorVersion;
__oldstack = (intptr_t)__builtin_frame_address(0);
DeduplicateStdioHandles();
if ((intptr_t)v_ntsubsystem == kNtImageSubsystemWindowsCui && version >= 10) {
rc = SetConsoleCP(kNtCpUtf8);
NTTRACE("SetConsoleCP(kNtCpUtf8) → %hhhd", rc);