mirror of
https://github.com/reactos/reactos.git
synced 2025-04-26 08:30:21 +00:00
- 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:
parent
d7ab2a464e
commit
d99f998d2d
4 changed files with 1 additions and 39 deletions
|
@ -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 );
|
|
||||||
}
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue