[AFD]
authorCameron Gutman <aicommander@gmail.com>
Thu, 9 Jun 2011 22:38:38 +0000 (22:38 +0000)
committerCameron Gutman <aicommander@gmail.com>
Thu, 9 Jun 2011 22:38:38 +0000 (22:38 +0000)
- Cleanup the pending connection list before closing the FCB
- Fixes yet another socket closure bug

svn path=/trunk/; revision=52166

reactos/drivers/network/afd/afd/listen.c
reactos/drivers/network/afd/afd/main.c

index ad22f00..7e09535 100644 (file)
@@ -95,7 +95,7 @@ static NTSTATUS NTAPI ListenComplete
     NTSTATUS Status = STATUS_SUCCESS;
     PAFD_FCB FCB = (PAFD_FCB)Context;
     PAFD_TDI_OBJECT_QELT Qelt;
-    PLIST_ENTRY NextIrpEntry, QeltEntry;
+    PLIST_ENTRY NextIrpEntry;
     PIRP NextIrp;
 
     if( !SocketAcquireStateLock( FCB ) )
@@ -115,13 +115,6 @@ static NTSTATUS NTAPI ListenComplete
               IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
         }
 
-        /* Free all pending connections */
-        while( !IsListEmpty( &FCB->PendingConnections ) ) {
-               QeltEntry = RemoveHeadList(&FCB->PendingConnections);
-               Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry);
-               ExFreePool(Qelt);
-        }
-
         /* Free ConnectionReturnInfo and ConnectionCallInfo */
         if (FCB->ListenIrp.ConnectionReturnInfo)
         {
index 0e27f50..bf981e3 100644 (file)
@@ -394,6 +394,9 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PAFD_FCB FCB = FileObject->FsContext;
     UINT i;
     PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
+    PAFD_TDI_OBJECT_QELT Qelt;
+    PLIST_ENTRY QeltEntry;
+    
 
     AFD_DbgPrint(MID_TRACE,
                 ("AfdClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp));
@@ -421,6 +424,24 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE );
 
+    ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECT]));
+    ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]));
+    ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_RECV]));
+    ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_PREACCEPT]));
+
+    while (!IsListEmpty(&FCB->PendingConnections))
+    {
+        QeltEntry = RemoveHeadList(&FCB->PendingConnections);
+        Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry);
+
+        /* We have to close all pending connections or the listen won't get closed */
+        TdiDisassociateAddressFile(Qelt->Object.Object);
+        ObDereferenceObject(Qelt->Object.Object);
+        ZwClose(Qelt->Object.Handle);
+
+        ExFreePool(Qelt);
+    }
+
     SocketStateUnlock( FCB );
 
     if( FCB->EventSelect )