1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Removed potential deadlocking bug from WSARecvEx and cleaned up a bit.

This commit is contained in:
Daniel Collins 2011-05-30 02:08:31 +00:00
parent cbbc7f13b1
commit 7aa42f5f78

View File

@ -128,40 +128,43 @@ INT APIENTRY EnumProtocolsW(LPINT protocols, LPVOID buf, LPDWORD bsptr) {
} }
int PASCAL WSARecvEx(SOCKET fd, char *buf, int len, int *flags) { 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(sockptr) {
if(!(ptr->flags & IPX_BOUND)) { if(!(sockptr->flags & IPX_BOUND)) {
RETURN_WSA(WSAEINVAL, -1); unlock_mutex();
WSASetLastError(WSAEINVAL);
return -1;
} }
unlock_mutex();
struct ipx_packet *packet = malloc(PACKET_BUF_SIZE); struct ipx_packet *packet = malloc(PACKET_BUF_SIZE);
if(!packet) { if(!packet) {
RETURN_WSA(ERROR_OUTOFMEMORY, -1); WSASetLastError(ERROR_OUTOFMEMORY);
return -1;
} }
int rval = r_WSARecvEx(fd, (char*)packet, PACKET_BUF_SIZE, flags); int rval = r_WSARecvEx(fd, (char*)packet, PACKET_BUF_SIZE, flags);
if(rval == -1) { if(rval == -1) {
RETURN(-1); return -1;
} }
if(packet->size <= len) { if(packet->size <= len) {
memcpy(buf, packet->data, packet->size); memcpy(buf, packet->data, packet->size);
len = packet->size;
free(packet);
*flags = 0; *flags = 0;
RETURN(len);
}else{ }else{
memcpy(buf, packet->data, len); memcpy(buf, packet->data, len);
len = packet->size;
free(packet);
*flags = MSG_PARTIAL; *flags = MSG_PARTIAL;
RETURN(len);
} }
len = packet->size;
free(packet);
return len;
}else{ }else{
RETURN(r_WSARecvEx(fd, buf, len, flags)); return r_WSARecvEx(fd, buf, len, flags);
} }
} }