- Cleanup the pending connection list before closing the FCB
- Fixes yet another socket closure bug

svn path=/trunk/; revision=52166
This commit is contained in:
Cameron Gutman 2011-06-09 22:38:38 +00:00
parent b02d5aea56
commit 4f74cccd2d
2 changed files with 22 additions and 8 deletions

View 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)
{

View 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 )