diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 1136ec87b95..f43c57bf9ab 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -7716,7 +7716,8 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol, RtlInitUnicodeString(&string, afdW); InitializeObjectAttributes(&attr, &string, (flags & WSA_FLAG_NO_HANDLE_INHERIT) ? 0 : OBJ_INHERIT, NULL, NULL); - if ((status = NtOpenFile(&handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &attr, &io, 0, 0))) + if ((status = NtOpenFile(&handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &attr, + &io, 0, (flags & WSA_FLAG_OVERLAPPED) ? 0 : FILE_SYNCHRONOUS_IO_NONALERT))) { WARN("Failed to create socket, status %#x.\n", status); WSASetLastError(NtStatusToWSAError(status)); @@ -7726,7 +7727,7 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol, create_params.family = unixaf; create_params.type = unixtype; create_params.protocol = protocol; - create_params.flags = flags & ~WSA_FLAG_NO_HANDLE_INHERIT; + create_params.flags = flags & ~(WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); if ((status = NtDeviceIoControlFile(handle, NULL, NULL, NULL, &io, IOCTL_AFD_CREATE, &create_params, sizeof(create_params), NULL, 0))) { diff --git a/server/sock.c b/server/sock.c index 3f19c77964a..43a17d46ee0 100644 --- a/server/sock.c +++ b/server/sock.c @@ -315,7 +315,7 @@ static inline int sock_error( struct fd *fd ) static int sock_dispatch_asyncs( struct sock *sock, int event, int error ) { - if ( sock->flags & WSA_FLAG_OVERLAPPED ) + if (is_fd_overlapped( sock->fd )) { if (event & (POLLIN|POLLPRI) && async_waiting( &sock->read_q )) { @@ -680,6 +680,7 @@ static struct sock *create_socket(void) static int init_socket( struct sock *sock, int family, int type, int protocol, unsigned int flags ) { + unsigned int options = 0; int sockfd; sockfd = socket( family, type, protocol ); @@ -696,10 +697,13 @@ static int init_socket( struct sock *sock, int family, int type, int protocol, u sock->type = type; sock->family = family; - if (sock->fd) release_object( sock->fd ); + if (sock->fd) + { + options = get_fd_options( sock->fd ); + release_object( sock->fd ); + } - if (!(sock->fd = create_anonymous_fd( &sock_fd_ops, sockfd, &sock->obj, - (flags & WSA_FLAG_OVERLAPPED) ? 0 : FILE_SYNCHRONOUS_IO_NONALERT ))) + if (!(sock->fd = create_anonymous_fd( &sock_fd_ops, sockfd, &sock->obj, options ))) { return -1; }