From 53346c2536263cf597435893f0e02723d02c42bb Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Sun, 24 Apr 2011 16:59:21 +0000 Subject: [PATCH] Updated how router thread checks packet sizes, cleaned up code --- src/ipxwrapper.c | 16 ++++++---------- src/ipxwrapper.h | 15 --------------- src/winsock.c | 1 - 3 files changed, 6 insertions(+), 26 deletions(-) diff --git a/src/ipxwrapper.c b/src/ipxwrapper.c index 1cb7c19..8e17d7b 100644 --- a/src/ipxwrapper.c +++ b/src/ipxwrapper.c @@ -305,18 +305,10 @@ static DWORD WINAPI router_main(LPVOID buf) { continue; } - if(rval < sizeof(ipx_packet)) { - debug("Recieved undersized packet, discarding"); - continue; - } - - packet->dest_socket = ntohs(packet->dest_socket); - packet->src_socket = ntohs(packet->src_socket); packet->size = ntohs(packet->size); - /* Prevent buffer overflows */ - if(packet->size > MAX_PACKET_SIZE) { - debug("Recieved oversized packet, discarding"); + if(packet->size > MAX_PACKET_SIZE || packet->size+sizeof(ipx_packet)-1 != rval) { + debug("Recieved packet with incorrect size field, discarding"); continue; } @@ -325,6 +317,10 @@ static DWORD WINAPI router_main(LPVOID buf) { add_host(packet->src_net, packet->src_node, ntohl(addr.sin_addr.s_addr)); for(sockptr = sockets; sockptr; sockptr = sockptr->next) { + /* TODO: Don't require IPX_BROADCAST for recieving broadcast packets + * (Make it optional? It was a bug in win95.) + */ + if( sockptr->flags & IPX_BOUND && sockptr->flags & IPX_RECV && diff --git a/src/ipxwrapper.h b/src/ipxwrapper.h index b04790f..5b54262 100644 --- a/src/ipxwrapper.h +++ b/src/ipxwrapper.h @@ -50,21 +50,6 @@ (ptr)->socket = 0;\ (ptr)->next = NULL; -#define INIT_PACKET(ptr) \ - (ptr)->ptype = 0;\ - memset((ptr)->dest_net, 0, 4);\ - memset((ptr)->dest_node, 0, 6);\ - (ptr)->dest_socket = 0;\ - memset((ptr)->src_net, 0, 4);\ - memset((ptr)->src_node, 0, 6);\ - (ptr)->src_socket = 0;\ - (ptr)->size = 0; - -#define INIT_HOST(ptr) \ - memset((ptr)->hwaddr, 0, 6);\ - (ptr)->ipaddr = 0;\ - (ptr)->next = NULL; - #define RETURN(...) \ unlock_mutex();\ return __VA_ARGS__; diff --git a/src/winsock.c b/src/winsock.c index 413b236..a27f711 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -642,7 +642,6 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s RETURN_WSA(ERROR_OUTOFMEMORY, -1); } - INIT_PACKET(packet); packet->ptype = sockptr->s_ptype; memcpy(packet->dest_net, ipxaddr->sa_netnum, 4);