From d99f998d2ddadc35356764f4a9c9c20aa25b9301 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 23 Mar 2009 05:05:57 +0000 Subject: [PATCH] - 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 --- reactos/drivers/network/afd/afd/lock.c | 11 ----------- reactos/drivers/network/afd/afd/read.c | 9 +-------- reactos/drivers/network/afd/afd/write.c | 18 ------------------ reactos/drivers/network/afd/include/afd.h | 2 -- 4 files changed, 1 insertion(+), 39 deletions(-) diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index d2b2884889c..689fa4a48f3 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -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 ); -} diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index 0d4450558df..d7f85c6fea2 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -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 ); diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index 39228852eac..160e89534ce 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -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; diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index 04749f04c72..76123064bc3 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -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 */