From 47e8c2cf0b914d94375c9b5bc7f80095c4f3cb15 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 27 Oct 2008 05:16:14 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r37010 - Most of the port allocation problems are now fixed svn path=/trunk/; revision=37011 --- reactos/drivers/network/tcpip/include/ports.h | 1 - .../drivers/network/tcpip/tcpip/fileobjs.c | 16 +++++ reactos/lib/drivers/ip/network/ports.c | 63 +++++++------------ .../lib/drivers/ip/transport/rawip/rawip.c | 4 +- reactos/lib/drivers/ip/transport/udp/udp.c | 12 +++- 5 files changed, 50 insertions(+), 46 deletions(-) diff --git a/reactos/drivers/network/tcpip/include/ports.h b/reactos/drivers/network/tcpip/include/ports.h index aac05aa7a7a..700682937e3 100644 --- a/reactos/drivers/network/tcpip/include/ports.h +++ b/reactos/drivers/network/tcpip/include/ports.h @@ -16,7 +16,6 @@ typedef struct _PORT_SET { PVOID ProtoBitBuffer; UINT StartingPort; UINT PortsToOversee; - UINT LastAllocatedPort; FAST_MUTEX Mutex; } PORT_SET, *PPORT_SET; diff --git a/reactos/drivers/network/tcpip/tcpip/fileobjs.c b/reactos/drivers/network/tcpip/tcpip/fileobjs.c index 054dd981701..915ea4acf03 100644 --- a/reactos/drivers/network/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/network/tcpip/tcpip/fileobjs.c @@ -285,6 +285,14 @@ NTSTATUS FileOpenAddress( case IPPROTO_TCP: AddrFile->Port = TCPAllocatePort(Address->Address[0].Address[0].sin_port); + + if (Address->Address[0].Address[0].sin_port && + AddrFile->Port != Address->Address[0].Address[0].sin_port) + { + ExFreePool(AddrFile); + return STATUS_INVALID_PARAMETER; + } + AddrFile->Send = NULL; /* TCPSendData */ break; @@ -292,6 +300,14 @@ NTSTATUS FileOpenAddress( TI_DbgPrint(MID_TRACE,("Allocating udp port\n")); AddrFile->Port = UDPAllocatePort(Address->Address[0].Address[0].sin_port); + + if (Address->Address[0].Address[0].sin_port && + AddrFile->Port != Address->Address[0].Address[0].sin_port) + { + ExFreePool(AddrFile); + return STATUS_INVALID_PARAMETER; + } + TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n", AddrFile->Port, Address->Address[0].Address[0].sin_port)); diff --git a/reactos/lib/drivers/ip/network/ports.c b/reactos/lib/drivers/ip/network/ports.c index 6630b5e77c3..468010371f5 100644 --- a/reactos/lib/drivers/ip/network/ports.c +++ b/reactos/lib/drivers/ip/network/ports.c @@ -15,8 +15,7 @@ NTSTATUS PortsStartup( PPORT_SET PortSet, UINT PortsToManage ) { PortSet->StartingPort = StartingPort; PortSet->PortsToOversee = PortsToManage; - PortSet->LastAllocatedPort = PortSet->StartingPort + - PortSet->PortsToOversee - 1; + PortSet->ProtoBitBuffer = PoolAllocateBuffer( (PortSet->PortsToOversee + 7) / 8 ); if(!PortSet->ProtoBitBuffer) return STATUS_INSUFFICIENT_RESOURCES; @@ -43,8 +42,13 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { BOOLEAN Clear; Port = htons(Port); - ASSERT(Port >= PortSet->StartingPort); - ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee); + + if ((Port < PortSet->StartingPort) || + (Port >= PortSet->StartingPort + PortSet->PortsToOversee)) + { + return FALSE; + } + Port -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); @@ -57,64 +61,41 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { ULONG AllocateAnyPort( PPORT_SET PortSet ) { ULONG AllocatedPort; - ULONG Next; - - if (PortSet->StartingPort + PortSet->PortsToOversee <= - PortSet->LastAllocatedPort + 1) { - Next = PortSet->StartingPort; - } else { - Next = PortSet->LastAllocatedPort + 1; - } - Next -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); - AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next ); + AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 ); if( AllocatedPort != (ULONG)-1 ) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; - PortSet->LastAllocatedPort = AllocatedPort; + ExReleaseFastMutex( &PortSet->Mutex ); + return htons(AllocatedPort); } ExReleaseFastMutex( &PortSet->Mutex ); - AllocatedPort = htons(AllocatedPort); - - ASSERT(AllocatedPort >= PortSet->StartingPort); - ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee); - - return AllocatedPort; + return -1; } ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) { ULONG AllocatedPort; - ULONG Next; - if (PortSet->StartingPort + PortSet->PortsToOversee <= - PortSet->LastAllocatedPort + 1) { - Next = PortSet->StartingPort; - } else { - Next = PortSet->LastAllocatedPort + 1; + if ((Lowest < PortSet->StartingPort) || + (Highest >= PortSet->StartingPort + PortSet->PortsToOversee)) + { + return -1; } - if (Next < Lowest || Highest <= Next) { - Next = Lowest; - } - Next -= PortSet->StartingPort; + Lowest -= PortSet->StartingPort; Highest -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); - AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next ); - if( AllocatedPort != (ULONG)-1 && AllocatedPort >= Lowest && - AllocatedPort <= Highest) { + AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest ); + if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; - PortSet->LastAllocatedPort = AllocatedPort; + ExReleaseFastMutex( &PortSet->Mutex ); + return htons(AllocatedPort); } ExReleaseFastMutex( &PortSet->Mutex ); - AllocatedPort = htons(AllocatedPort); - - ASSERT(AllocatedPort >= PortSet->StartingPort); - ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee); - - return AllocatedPort; + return -1; } diff --git a/reactos/lib/drivers/ip/transport/rawip/rawip.c b/reactos/lib/drivers/ip/transport/rawip/rawip.c index 90f0ac7b775..003e2377444 100644 --- a/reactos/lib/drivers/ip/transport/rawip/rawip.c +++ b/reactos/lib/drivers/ip/transport/rawip/rawip.c @@ -223,8 +223,10 @@ NTSTATUS RawIPSendDatagram( TI_DbgPrint(MID_TRACE,("About to get route to destination\n")); - if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) + if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) { + FreeNdisPacket(Packet.NdisPacket); return STATUS_UNSUCCESSFUL; + } TI_DbgPrint(MID_TRACE,("About to send datagram\n")); diff --git a/reactos/lib/drivers/ip/transport/udp/udp.c b/reactos/lib/drivers/ip/transport/udp/udp.c index b666c5410fd..ed39e071571 100644 --- a/reactos/lib/drivers/ip/transport/udp/udp.c +++ b/reactos/lib/drivers/ip/transport/udp/udp.c @@ -33,16 +33,20 @@ NTSTATUS AddUDPHeaderIPv4( */ { PUDP_HEADER UDPHeader; + NTSTATUS Status; TI_DbgPrint(MID_TRACE, ("Packet: %x NdisPacket %x\n", IPPacket, IPPacket->NdisPacket)); - AddGenericHeaderIPv4 + Status = AddGenericHeaderIPv4 ( RemoteAddress, RemotePort, LocalAddress, LocalPort, IPPacket, DataLength, IPPROTO_UDP, sizeof(UDP_HEADER), (PVOID *)&UDPHeader ); + if (!NT_SUCCESS(Status)) + return Status; + /* Build UDP header */ UDPHeader = (PUDP_HEADER)((ULONG_PTR)IPPacket->Data - sizeof(UDP_HEADER)); /* Port values are already big-endian values */ @@ -195,8 +199,10 @@ NTSTATUS UDPSendDatagram( if( !NT_SUCCESS(Status) ) return Status; - if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) + if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) { + FreeNdisPacket(Packet.NdisPacket); return STATUS_UNSUCCESSFUL; + } IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL ); @@ -305,7 +311,7 @@ NTSTATUS UDPStartup( NTSTATUS Status; - Status = PortsStartup( &UDPPorts, 1, 0xfffe ); + Status = PortsStartup( &UDPPorts, 1, UDP_STARTING_PORT + UDP_DYNAMIC_PORTS ); if( !NT_SUCCESS(Status) ) return Status;