From: Bernhard Übelacker <bernhardu@mailbox.org> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53574 --- dlls/ws2_32/tests/sock.c | 33 +++++++++++++++++++++++++++++++++ server/sock.c | 4 ++++ 2 files changed, 37 insertions(+) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 8d589c63ea3..f71b6d04dea 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -6875,6 +6875,39 @@ static void test_connect_events(struct event_test_ctx *ctx) closesocket(server); closesocket(listener); + + /* Test events getting cleared on second connect after connection got refused. + * w10pro64 sometimes takes over 2 seconds for an error to be reported, + * so make the test interactive-only. */ + //if (winetest_interactive) //disabled to run with gitlab, until leaving draft state + { + struct sockaddr_in invalid_addr; + memset( &invalid_addr, 0, sizeof(invalid_addr) ); + invalid_addr.sin_family = AF_INET; + invalid_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + invalid_addr.sin_port = htons(255); + + client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + ok(client != -1, "failed to create socket, error %u\n", WSAGetLastError()); + + select_events(ctx, client, FD_ACCEPT | FD_CLOSE | FD_CONNECT | FD_OOB | FD_READ | FD_WRITE); + check_events(ctx, 0, 0, 0); + check_events(ctx, 0, 0, 0); + + /* attempt to connect to closed port */ + ret = connect(client, (struct sockaddr*)&invalid_addr, sizeof(invalid_addr)); + ok(ret == SOCKET_ERROR, "expected SOCKET_ERROR, got %d\n", ret); + check_events(ctx, MAKELONG(FD_CONNECT, WSAECONNREFUSED), 0, 4000); + check_events(ctx, 0, 0, 0); + + /* try again to connect, should behave the same */ + ret = connect(client, (struct sockaddr*)&invalid_addr, sizeof(invalid_addr)); + ok(ret == SOCKET_ERROR, "expected SOCKET_ERROR, got %d\n", ret); + check_events(ctx, MAKELONG(FD_CONNECT, WSAECONNREFUSED), 0, 4000); + check_events(ctx, 0, 0, 0); + + closesocket(client); + } } /* perform a blocking recv() even on a nonblocking socket */ diff --git a/server/sock.c b/server/sock.c index 7785d3c7706..38ab92d3447 100644 --- a/server/sock.c +++ b/server/sock.c @@ -2733,6 +2733,10 @@ static void sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) return; case SOCK_UNCONNECTED: + sock->pending_events &= ~AFD_POLL_CONNECT_ERR; + sock->reported_events &= ~AFD_POLL_CONNECT_ERR; + break; + case SOCK_CONNECTIONLESS: break; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10044