[ros-diffs] [cgutman] 40183: - 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

cgutman at svn.reactos.org cgutman at svn.reactos.org
Mon Mar 23 06:05:59 CET 2009


Author: cgutman
Date: Mon Mar 23 08:05:57 2009
New Revision: 40183

URL: http://svn.reactos.org/svn/reactos?rev=40183&view=rev
Log:
 - 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

Modified:
    trunk/reactos/drivers/network/afd/afd/lock.c
    trunk/reactos/drivers/network/afd/afd/read.c
    trunk/reactos/drivers/network/afd/afd/write.c
    trunk/reactos/drivers/network/afd/include/afd.h

Modified: trunk/reactos/drivers/network/afd/afd/lock.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/lock.c?rev=40183&r1=40182&r2=40183&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] Mon Mar 23 08:05:57 2009
@@ -323,14 +323,3 @@
 		    &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 );
-}

Modified: trunk/reactos/drivers/network/afd/afd/read.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/read.c?rev=40183&r1=40182&r2=40183&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Mon Mar 23 08:05:57 2009
@@ -104,8 +104,6 @@
 	if( !FCB->ReceiveIrp.InFlightRequest ) {
 	    AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
 
-	    SocketCalloutEnter( FCB );
-
 	    Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
 				 FCB->Connection.Object,
 				 TDI_RECEIVE_NORMAL,
@@ -114,8 +112,6 @@
 				 &FCB->ReceiveIrp.Iosb,
 				 ReceiveComplete,
 				 FCB );
-
-	    SocketCalloutLeave( FCB );
 
             if( Status == STATUS_SUCCESS )
                 FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
@@ -559,9 +555,8 @@
     PollReeval( FCB->DeviceExt, FCB->FileObject );
 
     if( NT_SUCCESS(Irp->IoStatus.Status) ) {
+
 	/* Now relaunch the datagram request */
-	SocketCalloutEnter( FCB );
-
 	Status = TdiReceiveDatagram
 	    ( &FCB->ReceiveIrp.InFlightRequest,
 	      FCB->AddressFile.Object,
@@ -572,8 +567,6 @@
 	      &FCB->ReceiveIrp.Iosb,
 	      PacketSocketRecvComplete,
 	      FCB );
-
-	SocketCalloutLeave( FCB );
     }
 
     SocketStateUnlock( FCB );

Modified: trunk/reactos/drivers/network/afd/afd/write.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/write.c?rev=40183&r1=40182&r2=40183&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] Mon Mar 23 08:05:57 2009
@@ -134,8 +134,6 @@
     if( FCB->Send.BytesUsed ) {
 	FCB->PollState &= ~AFD_EVENT_SEND;
 
-	SocketCalloutEnter( FCB );
-
 	Status = TdiSend( &FCB->SendIrp.InFlightRequest,
 			  FCB->Connection.Object,
 			  0,
@@ -144,8 +142,6 @@
 			  &FCB->SendIrp.Iosb,
 			  SendComplete,
 			  FCB );
-
-	SocketCalloutLeave( FCB );
     } else {
 	FCB->PollState |= AFD_EVENT_SEND;
     }
@@ -260,8 +256,6 @@
         TdiBuildConnectionInfo( &TargetAddress, FCB->RemoteAddress );
 
 	if( TargetAddress ) {
-            SocketCalloutEnter( FCB );
-
             Status = TdiSendDatagram
                 ( &FCB->SendIrp.InFlightRequest,
                   FCB->AddressFile.Object,
@@ -272,8 +266,6 @@
                   PacketSocketSendComplete,
                   FCB );
 
-           SocketCalloutLeave( FCB );
-
            ExFreePool( TargetAddress );
 	} else Status = STATUS_NO_MEMORY;
 
@@ -358,10 +350,6 @@
 	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 @@
 			      SendComplete,
 			      FCB );
 
-	    SocketCalloutLeave( FCB );
-
 	    if( Status == STATUS_PENDING )
 		Status = STATUS_SUCCESS;
 
@@ -434,8 +420,6 @@
     /* Check the size of the Address given ... */
 
     if( TargetAddress ) {
-	SocketCalloutEnter( FCB );
-
 	Status = TdiSendDatagram
 	    ( &FCB->SendIrp.InFlightRequest,
 	      FCB->AddressFile.Object,
@@ -446,8 +430,6 @@
 	      PacketSocketSendComplete,
 	      FCB );
 
-	SocketCalloutLeave( FCB );
-
 	ExFreePool( TargetAddress );
     } else Status = STATUS_NO_MEMORY;
 

Modified: trunk/reactos/drivers/network/afd/include/afd.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/include/afd.h?rev=40183&r1=40182&r2=40183&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] Mon Mar 23 08:05:57 2009
@@ -271,8 +271,6 @@
 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 */
 



More information about the Ros-diffs mailing list