From 7aa42f5f78fab7d0582b0e68f93643e4e59e6656 Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Mon, 30 May 2011 02:08:31 +0000 Subject: [PATCH] Removed potential deadlocking bug from WSARecvEx and cleaned up a bit. --- src/winsock.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/winsock.c b/src/winsock.c index 395300c..bd23c51 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -128,40 +128,43 @@ INT APIENTRY EnumProtocolsW(LPINT protocols, LPVOID buf, LPDWORD bsptr) { } int PASCAL WSARecvEx(SOCKET fd, char *buf, int len, int *flags) { - ipx_socket *ptr = get_socket(fd); + ipx_socket *sockptr = get_socket(fd); - if(ptr) { - if(!(ptr->flags & IPX_BOUND)) { - RETURN_WSA(WSAEINVAL, -1); + if(sockptr) { + if(!(sockptr->flags & IPX_BOUND)) { + unlock_mutex(); + + WSASetLastError(WSAEINVAL); + return -1; } + unlock_mutex(); + struct ipx_packet *packet = malloc(PACKET_BUF_SIZE); if(!packet) { - RETURN_WSA(ERROR_OUTOFMEMORY, -1); + WSASetLastError(ERROR_OUTOFMEMORY); + return -1; } int rval = r_WSARecvEx(fd, (char*)packet, PACKET_BUF_SIZE, flags); if(rval == -1) { - RETURN(-1); + return -1; } if(packet->size <= len) { memcpy(buf, packet->data, packet->size); - len = packet->size; - free(packet); - *flags = 0; - RETURN(len); }else{ memcpy(buf, packet->data, len); - len = packet->size; - free(packet); - *flags = MSG_PARTIAL; - RETURN(len); } + + len = packet->size; + free(packet); + + return len; }else{ - RETURN(r_WSARecvEx(fd, buf, len, flags)); + return r_WSARecvEx(fd, buf, len, flags); } }