ws2_32: Check for presence in the socket list in closesocket().

Instead of trying to retrieve the fd.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-08-02 19:37:37 -05:00 committed by Alexandre Julliard
parent 9ea5d41cd1
commit c70f64f82c
1 changed files with 20 additions and 41 deletions

View File

@ -396,7 +396,7 @@ static BOOL socket_list_find( SOCKET socket )
}
static void socket_list_remove(SOCKET socket)
static BOOL socket_list_remove( SOCKET socket )
{
unsigned int i;
@ -406,10 +406,12 @@ static void socket_list_remove(SOCKET socket)
if (socket_list[i] == socket)
{
socket_list[i] = 0;
break;
LeaveCriticalSection( &cs_socket_list );
return TRUE;
}
}
LeaveCriticalSection(&cs_socket_list);
return FALSE;
}
#define WS_MAX_SOCKETS_PER_PROCESS 128 /* reasonable guess */
@ -584,29 +586,6 @@ static DWORD NtStatusToWSAError( NTSTATUS status )
return NT_SUCCESS(status) ? RtlNtStatusToDosErrorNoTeb(status) : WSAEINVAL;
}
/* set last error code from NT status without mapping WSA errors */
static inline unsigned int set_error( unsigned int err )
{
if (err)
{
err = NtStatusToWSAError( err );
SetLastError( err );
}
return err;
}
static inline int get_sock_fd( SOCKET s, DWORD access, unsigned int *options )
{
int fd;
if (set_error( wine_server_handle_to_fd( SOCKET2HANDLE(s), access, &fd, options ) ))
return -1;
return fd;
}
static inline void release_sock_fd( SOCKET s, int fd )
{
close( fd );
}
struct per_thread_data *get_per_thread_data(void)
{
@ -1514,26 +1493,26 @@ int WINAPI WS_bind( SOCKET s, const struct WS_sockaddr *addr, int len )
/***********************************************************************
* closesocket (WS2_32.3)
* closesocket (ws2_32.3)
*/
int WINAPI WS_closesocket(SOCKET s)
int WINAPI WS_closesocket( SOCKET s )
{
int res = SOCKET_ERROR, fd;
if (num_startup)
TRACE( "%#lx\n", s );
if (!num_startup)
{
fd = get_sock_fd(s, FILE_READ_DATA, NULL);
if (fd >= 0)
{
release_sock_fd(s, fd);
socket_list_remove(s);
if (CloseHandle(SOCKET2HANDLE(s)))
res = 0;
}
SetLastError( WSANOTINITIALISED );
return -1;
}
else
SetLastError(WSANOTINITIALISED);
TRACE("(socket %04lx) -> %d\n", s, res);
return res;
if (!socket_list_remove( s ))
{
SetLastError( WSAENOTSOCK );
return -1;
}
CloseHandle( (HANDLE)s );
return 0;
}