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:
parent
cbbc7f13b1
commit
7aa42f5f78
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user