mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
[AFD]
- 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:
parent
b02d5aea56
commit
4f74cccd2d
2 changed files with 22 additions and 8 deletions
|
@ -95,7 +95,7 @@ static NTSTATUS NTAPI ListenComplete
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PAFD_FCB FCB = (PAFD_FCB)Context;
|
PAFD_FCB FCB = (PAFD_FCB)Context;
|
||||||
PAFD_TDI_OBJECT_QELT Qelt;
|
PAFD_TDI_OBJECT_QELT Qelt;
|
||||||
PLIST_ENTRY NextIrpEntry, QeltEntry;
|
PLIST_ENTRY NextIrpEntry;
|
||||||
PIRP NextIrp;
|
PIRP NextIrp;
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) )
|
if( !SocketAcquireStateLock( FCB ) )
|
||||||
|
@ -115,13 +115,6 @@ static NTSTATUS NTAPI ListenComplete
|
||||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
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 */
|
/* Free ConnectionReturnInfo and ConnectionCallInfo */
|
||||||
if (FCB->ListenIrp.ConnectionReturnInfo)
|
if (FCB->ListenIrp.ConnectionReturnInfo)
|
||||||
{
|
{
|
||||||
|
|
|
@ -394,6 +394,9 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
UINT i;
|
UINT i;
|
||||||
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
|
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
|
||||||
|
PAFD_TDI_OBJECT_QELT Qelt;
|
||||||
|
PLIST_ENTRY QeltEntry;
|
||||||
|
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,
|
AFD_DbgPrint(MID_TRACE,
|
||||||
("AfdClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp));
|
("AfdClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp));
|
||||||
|
@ -421,6 +424,24 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE );
|
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 );
|
SocketStateUnlock( FCB );
|
||||||
|
|
||||||
if( FCB->EventSelect )
|
if( FCB->EventSelect )
|
||||||
|
|
Loading…
Reference in a new issue