diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index d3a4590..dd818f2 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -1700,7 +1700,7 @@ static NTSTATUS WS2_async_accept( void *arg, IO_STATUS_BLOCK *iosb, NTSTATUS sta if (status != STATUS_PENDING) goto finish; - return STATUS_SUCCESS; + return STATUS_ALERTED; finish: iosb->u.Status = status; @@ -1708,8 +1708,6 @@ finish: if (wsa->user_overlapped->hEvent) SetEvent(wsa->user_overlapped->hEvent); - if (wsa->cvalue) - WS_AddCompletion( HANDLE2SOCKET(wsa->listen_socket), wsa->cvalue, iosb->u.Status, iosb->Information ); *apc = ws2_async_accept_apc; return status; @@ -2040,7 +2038,9 @@ static BOOL WINAPI WS2_AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DW req->async.callback = wine_server_client_ptr( WS2_async_accept ); req->async.iosb = wine_server_client_ptr( overlapped ); req->async.arg = wine_server_client_ptr( wsa ); - /* We don't set event or completion since we may also have to read */ + req->async.cvalue = cvalue; + /* We don't set event since we may also have to read, completion returns STATUS_ALERTED + * to indicate that no completion should be queued. */ status = wine_server_call( req ); } SERVER_END_REQ; diff --git a/server/async.c b/server/async.c index dd28dff..b8be5cd 100644 --- a/server/async.c +++ b/server/async.c @@ -256,10 +256,12 @@ void async_set_result( struct object *obj, unsigned int status, unsigned int tot else { if (async->timeout) remove_timeout_user( async->timeout ); + if (async->completion && async->data.cvalue && status != STATUS_ALERTED) + add_completion( async->completion, async->comp_key, async->data.cvalue, status, total ); + else if (async->completion && async->data.cvalue && status == STATUS_ALERTED) + status = STATUS_SUCCESS; async->timeout = NULL; async->status = status; - if (async->completion && async->data.cvalue) - add_completion( async->completion, async->comp_key, async->data.cvalue, status, total ); if (apc) { apc_call_t data;