- This should fix a rare afd crash

- It was a race condition caused by another thread clearing our IRP while we were still using it

svn path=/trunk/; revision=40183
This commit is contained in:
Cameron Gutman 2009-03-23 05:05:57 +00:00
parent d7ab2a464e
commit d99f998d2d
4 changed files with 1 additions and 39 deletions

View file

@ -323,14 +323,3 @@ NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function ) {
&Irp->Tail.Overlay.ListEntry );
return UnlockAndMaybeComplete( FCB, STATUS_PENDING, Irp, 0, NULL );
}
VOID SocketCalloutEnter( PAFD_FCB FCB ) {
ASSERT(FCB->Locked);
FCB->Critical = TRUE;
SocketStateUnlock( FCB );
}
VOID SocketCalloutLeave( PAFD_FCB FCB ) {
FCB->Critical = FALSE;
SocketAcquireStateLock( FCB );
}

View file

@ -104,8 +104,6 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
if( !FCB->ReceiveIrp.InFlightRequest ) {
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
SocketCalloutEnter( FCB );
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
FCB->Connection.Object,
TDI_RECEIVE_NORMAL,
@ -115,8 +113,6 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
ReceiveComplete,
FCB );
SocketCalloutLeave( FCB );
if( Status == STATUS_SUCCESS )
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
HandleEOFOnIrp( FCB, Status, FCB->ReceiveIrp.Iosb.Information );
@ -559,9 +555,8 @@ PacketSocketRecvComplete(
PollReeval( FCB->DeviceExt, FCB->FileObject );
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
/* Now relaunch the datagram request */
SocketCalloutEnter( FCB );
/* Now relaunch the datagram request */
Status = TdiReceiveDatagram
( &FCB->ReceiveIrp.InFlightRequest,
FCB->AddressFile.Object,
@ -572,8 +567,6 @@ PacketSocketRecvComplete(
&FCB->ReceiveIrp.Iosb,
PacketSocketRecvComplete,
FCB );
SocketCalloutLeave( FCB );
}
SocketStateUnlock( FCB );

View file

@ -134,8 +134,6 @@ static NTSTATUS NTAPI SendComplete
if( FCB->Send.BytesUsed ) {
FCB->PollState &= ~AFD_EVENT_SEND;
SocketCalloutEnter( FCB );
Status = TdiSend( &FCB->SendIrp.InFlightRequest,
FCB->Connection.Object,
0,
@ -144,8 +142,6 @@ static NTSTATUS NTAPI SendComplete
&FCB->SendIrp.Iosb,
SendComplete,
FCB );
SocketCalloutLeave( FCB );
} else {
FCB->PollState |= AFD_EVENT_SEND;
}
@ -260,8 +256,6 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
TdiBuildConnectionInfo( &TargetAddress, FCB->RemoteAddress );
if( TargetAddress ) {
SocketCalloutEnter( FCB );
Status = TdiSendDatagram
( &FCB->SendIrp.InFlightRequest,
FCB->AddressFile.Object,
@ -272,8 +266,6 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PacketSocketSendComplete,
FCB );
SocketCalloutLeave( FCB );
ExFreePool( TargetAddress );
} else Status = STATUS_NO_MEMORY;
@ -358,10 +350,6 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
if( TotalBytesCopied > 0 ) {
UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE );
FCB->SendIrp.InFlightRequest = (PVOID)1; /* Placeholder */
SocketCalloutEnter( FCB );
Status = TdiSend( &FCB->SendIrp.InFlightRequest,
FCB->Connection.Object,
0,
@ -371,8 +359,6 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
SendComplete,
FCB );
SocketCalloutLeave( FCB );
if( Status == STATUS_PENDING )
Status = STATUS_SUCCESS;
@ -434,8 +420,6 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
/* Check the size of the Address given ... */
if( TargetAddress ) {
SocketCalloutEnter( FCB );
Status = TdiSendDatagram
( &FCB->SendIrp.InFlightRequest,
FCB->AddressFile.Object,
@ -446,8 +430,6 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PacketSocketSendComplete,
FCB );
SocketCalloutLeave( FCB );
ExFreePool( TargetAddress );
} else Status = STATUS_NO_MEMORY;

View file

@ -271,8 +271,6 @@ PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
VOID SocketCalloutEnter( PAFD_FCB FCB );
VOID SocketCalloutLeave( PAFD_FCB FCB );
/* main.c */