- 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

svn path=/trunk/; revision=41638
This commit is contained in:
Cameron Gutman
2009-06-27 08:48:58 +00:00
parent ad9f3a761f
commit a932210bfa
5 changed files with 19 additions and 21 deletions
+7 -11
View File
@@ -64,7 +64,6 @@ VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) {
/* 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 @@ VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE,
("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 @@ VOID NCETimeout(
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 @@ VOID NBShutdown(VOID)
NextNCE = CurNCE->Next;
/* Flush wait queue */
NBFlushPacketQueue( CurNCE, FALSE, STATUS_SUCCESS );
NBFlushPacketQueue( CurNCE, NDIS_STATUS_NOT_ACCEPTED );
CurNCE = NextNCE;
}
@@ -528,7 +524,7 @@ VOID NBRemoveNeighbor(
/* 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;
+1 -8
View File
@@ -415,7 +415,6 @@ PFIB_ENTRY RouterCreateRoute(
*/
{
KIRQL OldIrql;
PFIB_ENTRY FIBE;
PLIST_ENTRY CurrentEntry;
PLIST_ENTRY NextEntry;
PFIB_ENTRY Current;
@@ -450,13 +449,7 @@ PFIB_ENTRY RouterCreateRoute(
return NULL;
}
FIBE = RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
if (!FIBE) {
/* Not enough free resources */
NBRemoveNeighbor(NCE);
}
return FIBE;
return RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
}
@@ -106,7 +106,10 @@ VOID DGDeliverData(
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);
@@ -148,6 +148,7 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request,
Bucket->AssociatedEndpoint = Connection;
Bucket->Request.RequestNotifyObject = Complete;
Bucket->Request.RequestContext = Context;
IoMarkIrpPending((PIRP)Context);
InsertHeadList( &Listener->ListenRequest, &Bucket->Entry );
} else
Status = STATUS_NO_MEMORY;
+6 -1
View File
@@ -643,6 +643,8 @@ NTSTATUS TCPConnect
Bucket->Request.RequestNotifyObject = (PVOID)Complete;
Bucket->Request.RequestContext = Context;
IoMarkIrpPending((PIRP)Context);
InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry );
}
}
@@ -767,8 +769,9 @@ NTSTATUS TCPReceiveData
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 @@ NTSTATUS TCPSendData
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"));