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

View file

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