Patch by Cameron Gutman (aicommander <at> gmail <dot> com)

- Don't mess with cancelled IRPs
- Don't attempt to cancel an already cancelled IRP
- Unmap MDL when then IRP gets completed

svn path=/trunk/; revision=34567
This commit is contained in:
Art Yerkes 2008-07-17 19:42:26 +00:00
parent 846c750785
commit ecdd55845d
4 changed files with 27 additions and 2 deletions

View file

@ -82,6 +82,7 @@ static NTSTATUS NTAPI ListenComplete
if ( Irp->Cancel ) {
/* FIXME: is this anything else we need to do? */
FCB->ListenIrp.InFlightRequest = NULL;
return STATUS_SUCCESS;
}

View file

@ -243,7 +243,9 @@ NTSTATUS NTAPI UnlockAndMaybeComplete
otherwise it may be completed by StreamSocketConnectComplete()
before we return from SocketStateUnlock(). */
IoMarkIrpPending( Irp );
SocketStateUnlock( FCB );
SocketStateUnlock( FCB );
if( ShouldUnlock )
UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
} else {
SocketStateUnlock( FCB );
Irp->IoStatus.Status = Status;

View file

@ -154,6 +154,7 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
FCB->Overread ? STATUS_END_OF_FILE : STATUS_SUCCESS;
NextIrp->IoStatus.Information = 0;
if( NextIrp == Irp ) RetStatus = Status;
UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
FCB->Overread = TRUE;
//FCB->PollState |= AFD_EVENT_DISCONNECT;
@ -197,6 +198,7 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
NextIrp->IoStatus.Status = Status;
NextIrp->IoStatus.Information = TotalBytesCopied;
if( NextIrp == Irp ) RetStatus = Status;
UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
}
}
@ -225,6 +227,11 @@ NTSTATUS NTAPI ReceiveComplete
ASSERT_IRQL(APC_LEVEL);
if (Irp->Cancel) {
FCB->ReceiveIrp.InFlightRequest = NULL;
return STATUS_SUCCESS;
}
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->ReceiveIrp.InFlightRequest = NULL;
@ -299,7 +306,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
if( !RecvReq->BufferArray ) {
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
Irp, 0, NULL, FALSE );
Irp, 0, NULL, TRUE );
}
Irp->IoStatus.Status = STATUS_PENDING;
@ -441,6 +448,11 @@ PacketSocketRecvComplete(
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
if (Irp->Cancel) {
FCB->ReceiveIrp.InFlightRequest = NULL;
return STATUS_SUCCESS;
}
if( !SocketAcquireStateLock( FCB ) ) return STATUS_UNSUCCESSFUL;
FCB->ReceiveIrp.InFlightRequest = NULL;

View file

@ -40,6 +40,11 @@ static NTSTATUS NTAPI SendComplete
ASSERT_IRQL(APC_LEVEL);
if (Irp->Cancel) {
FCB->ReceiveIrp.InFlightRequest = NULL;
return STATUS_SUCCESS;
}
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->SendIrp.InFlightRequest = NULL;
@ -169,6 +174,11 @@ static NTSTATUS NTAPI PacketSocketSendComplete
Irp->IoStatus.Status,
Irp->IoStatus.Information));
if (Irp->Cancel) {
FCB->ReceiveIrp.InFlightRequest = NULL;
return STATUS_SUCCESS;
}
/* It's ok if the FCB already died */
if( !SocketAcquireStateLock( FCB ) ) return STATUS_SUCCESS;