[PATCH 1/6] ws2_32: Check for presence in the socket list in closesocket().
Zebediah Figura
zfigura at codeweavers.com
Mon Aug 2 19:37:37 CDT 2021
Instead of trying to retrieve the fd.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/ws2_32/socket.c | 61 +++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 41 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index f7996410db1..40e4ecb9325 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -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;
}
--
2.32.0
More information about the wine-devel
mailing list