Author: cgutman
Date: Sat Jun 27 12:48:58 2009
New Revision: 41638
URL:
http://svn.reactos.org/svn/reactos?rev=41638&view=rev
Log:
- Always call the completion handler so we don't leak packet descriptors
- Don't remove the NCE if we fail because it may not be ours
- Mark the IRPs pending before we insert them into our queue
- Check that the addresses match so we don't receive somebody else's packets
- Part 1 of 2
Modified:
trunk/reactos/lib/drivers/ip/network/neighbor.c
trunk/reactos/lib/drivers/ip/network/router.c
trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c
trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
Modified: trunk/reactos/lib/drivers/ip/network/neighbor.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/nei…
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/neighbor.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/neighbor.c [iso-8859-1] Sat Jun 27 12:48:58 2009
@@ -64,7 +64,6 @@
/* Must be called with table lock acquired */
VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE,
- BOOLEAN CallComplete,
NTSTATUS ErrorCode ) {
PLIST_ENTRY PacketEntry;
PNEIGHBOR_PACKET Packet;
@@ -81,13 +80,10 @@
("PacketEntry: %x, NdisPacket %x\n",
PacketEntry, Packet->Packet));
- if( CallComplete )
- {
- ASSERT_KM_POINTER(Packet->Complete);
- Packet->Complete( Packet->Context,
- Packet->Packet,
- ErrorCode );
- }
+ ASSERT_KM_POINTER(Packet->Complete);
+ Packet->Complete( Packet->Context,
+ Packet->Packet,
+ ErrorCode );
exFreePool( Packet );
}
@@ -117,7 +113,7 @@
so maybe it's not that big a problem */
/* Flush packet queue */
- NBFlushPacketQueue( NCE, TRUE, NDIS_STATUS_REQUEST_ABORTED );
+ NBFlushPacketQueue( NCE, NDIS_STATUS_REQUEST_ABORTED );
NCE->EventCount = 0;
}
else
@@ -213,7 +209,7 @@
NextNCE = CurNCE->Next;
/* Flush wait queue */
- NBFlushPacketQueue( CurNCE, FALSE, STATUS_SUCCESS );
+ NBFlushPacketQueue( CurNCE, NDIS_STATUS_NOT_ACCEPTED );
CurNCE = NextNCE;
}
@@ -528,7 +524,7 @@
/* Found it, now unlink it from the list */
*PrevNCE = CurNCE->Next;
- NBFlushPacketQueue( CurNCE, TRUE, NDIS_STATUS_REQUEST_ABORTED );
+ NBFlushPacketQueue( CurNCE, NDIS_STATUS_REQUEST_ABORTED );
exFreePool(CurNCE);
break;
Modified: trunk/reactos/lib/drivers/ip/network/router.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/rou…
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/router.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/router.c [iso-8859-1] Sat Jun 27 12:48:58 2009
@@ -415,7 +415,6 @@
*/
{
KIRQL OldIrql;
- PFIB_ENTRY FIBE;
PLIST_ENTRY CurrentEntry;
PLIST_ENTRY NextEntry;
PFIB_ENTRY Current;
@@ -450,13 +449,7 @@
return NULL;
}
- FIBE = RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
- if (!FIBE) {
- /* Not enough free resources */
- NBRemoveNeighbor(NCE);
- }
-
- return FIBE;
+ return RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
}
Modified: trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/d…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c [iso-8859-1] Sat Jun 27
12:48:58 2009
@@ -106,7 +106,10 @@
while((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) {
Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST,
ListEntry);
- if( DstPort == AddrFile->Port ) {
+ if( DstPort == AddrFile->Port &&
+ (AddrIsEqual(DstAddress, &AddrFile->Address) ||
+ AddrIsUnspecified(&AddrFile->Address) ||
+ AddrIsUnspecified(DstAddress))) {
Found = TRUE;
/* Remove the request from the queue */
RemoveEntryList(&Current->ListEntry);
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Sat Jun 27 12:48:58
2009
@@ -148,6 +148,7 @@
Bucket->AssociatedEndpoint = Connection;
Bucket->Request.RequestNotifyObject = Complete;
Bucket->Request.RequestContext = Context;
+ IoMarkIrpPending((PIRP)Context);
InsertHeadList( &Listener->ListenRequest, &Bucket->Entry );
} else
Status = STATUS_NO_MEMORY;
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Sat Jun 27 12:48:58
2009
@@ -643,6 +643,8 @@
Bucket->Request.RequestNotifyObject = (PVOID)Complete;
Bucket->Request.RequestContext = Context;
+ IoMarkIrpPending((PIRP)Context);
+
InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry );
}
}
@@ -767,8 +769,9 @@
Bucket->Request.RequestContext = Context;
*BytesReceived = 0;
+ IoMarkIrpPending((PIRP)Context);
+
InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry );
- Status = STATUS_PENDING;
TI_DbgPrint(DEBUG_TCP,("Queued read irp\n"));
} else {
TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status,
Received));
@@ -833,6 +836,8 @@
Bucket->Request.RequestNotifyObject = Complete;
Bucket->Request.RequestContext = Context;
*BytesSent = 0;
+
+ IoMarkIrpPending((PIRP)Context);
InsertTailList( &Connection->SendRequest, &Bucket->Entry );
TI_DbgPrint(DEBUG_TCP,("Queued write irp\n"));