mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 04:13:34 +00:00
- 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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"));
|
||||
|
||||
Reference in New Issue
Block a user