Fix Windows stdin regression

The non-blocking standard input feature was broken by ec957491e.
This commit is contained in:
Justine Tunney 2023-08-21 21:03:09 -07:00
parent 7e08a97cea
commit b9eb656e41
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
4 changed files with 19 additions and 7 deletions

View file

@ -135,8 +135,8 @@ dontasan dontubsan dontinstrument textwindows void WinMainStdin(void) {
NTTRACE("<stdin> CreateThread failed");
return;
}
g_fds.stdin.thread = hStdin;
g_fds.stdin.handle = hThread;
g_fds.stdin.handle = hStdin;
g_fds.stdin.thread = hThread;
g_fds.stdin.reader = hReader;
g_fds.stdin.writer = hWriter;
g_fds.stdin.inisem = hSemaphore;

View file

@ -330,7 +330,7 @@ privileged long kloghandle(void) {
kNtDuplicateSameAccess);
} else if (n && n < 512) {
hand = __imp_CreateFileW(
path, kNtGenericWrite | kNtFileAppendData,
path, kNtFileAppendData,
kNtFileShareRead | kNtFileShareWrite | kNtFileShareDelete,
&kNtIsInheritable, kNtOpenAlways, kNtFileAttributeNormal, 0);
} else {

View file

@ -202,15 +202,15 @@ __msabi textwindows int64_t WinMain(int64_t hInstance, int64_t hPrevInstance,
kStartTsc = rdtsc();
__umask = 077;
__pid = __imp_GetCurrentProcessId();
DeduplicateStdioHandles();
if (_weaken(WinMainStdin)) {
_weaken(WinMainStdin)();
}
cmdline = MyCommandLine();
#ifdef SYSDEBUG
// sloppy flag-only check for early initialization
if (__strstr16(cmdline, u"--strace")) ++__strace;
#endif
DeduplicateStdioHandles();
if (_weaken(WinMainStdin)) {
_weaken(WinMainStdin)();
}
if (_weaken(WinSockInit)) {
_weaken(WinSockInit)();
}

View file

@ -214,3 +214,15 @@ TEST(posixAdvisoryLocks, twoProcesses) {
ASSERT_SYS(0, 0, sigaction(SIGUSR1, &oldsa, 0));
ASSERT_SYS(0, 0, sigprocmask(SIG_SETMASK, &oldss, 0));
}
TEST(fcntl, nonblock) {
int pfds[2];
char buf[8];
ASSERT_SYS(0, 0, pipe(pfds));
ASSERT_SYS(0, 0, fcntl(pfds[0], F_SETFL, O_RDONLY));
ASSERT_SYS(0, 0, fcntl(pfds[0], F_SETFL, O_RDONLY | O_NONBLOCK));
ASSERT_SYS(EAGAIN, -1, read(pfds[0], buf, 8));
ASSERT_SYS(0, 0, fcntl(pfds[0], F_SETFL, O_RDONLY));
ASSERT_SYS(0, 0, close(pfds[1]));
ASSERT_SYS(0, 0, close(pfds[0]));
}