Fix bug with send() on Windows in O_NONBLOCK mode

There is a bug in WIN32 where using CancelIoEx() on an overlapped i/o op
initiated by WSASend() will cause WSAGetOverlappedResult() to report the
operation failed when it actually succeeded. We now work around that, by
having send and sendto initially consult WSAPoll() on O_NONBLOCK sockets
This commit is contained in:
Justine Tunney 2024-09-16 20:49:58 -07:00
parent 5aa970bc4e
commit 3c58ecd00c
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
4 changed files with 22 additions and 5 deletions

View file

@ -60,7 +60,7 @@ textwindows ssize_t sys_sendto_nt(int fd, const struct iovec *iov,
bool nonblock = (f->flags & O_NONBLOCK) || (flags & _MSG_DONTWAIT);
flags &= ~_MSG_DONTWAIT;
rc = __winsock_block(
f->handle, flags, nonblock, f->sndtimeo, m, sys_sendto_nt_start,
f->handle, flags, -nonblock, f->sndtimeo, m, sys_sendto_nt_start,
&(struct SendToArgs){iov, iovlen, opt_in_addr, in_addrsize});
__sig_unblock(m);
return rc;