- Change STATUS_UNSUCCESSFUL to STATUS_FILE_CLOSED

- Move the Irp->Cancel check after SocketAcquireStateLock to fix a possible crash
 - Change STATUS_INVALID_PARAMETER to STATUS_FILE_CLOSED
 - Move SocketAcquireStateLock in front of the check for a NULL return from LockRequest to prevent another possible crash

svn path=/branches/aicom-network-fixes/; revision=35419
This commit is contained in:
Cameron Gutman
2008-08-17 22:12:31 +00:00
parent ec037e4d9d
commit 8b67a0b644
4 changed files with 16 additions and 17 deletions
+6 -7
View File
@@ -83,20 +83,19 @@ static NTSTATUS NTAPI ListenComplete
( PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context ) {
NTSTATUS Status = STATUS_UNSUCCESSFUL;
NTSTATUS Status = STATUS_FILE_CLOSED;
PAFD_FCB FCB = (PAFD_FCB)Context;
PAFD_TDI_OBJECT_QELT Qelt;
if ( Irp->Cancel ) {
/* FIXME: is this anything else we need to do? */
FCB->ListenIrp.InFlightRequest = NULL;
return STATUS_SUCCESS;
}
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->ListenIrp.InFlightRequest = NULL;
if( Irp->Cancel ) {
SocketStateUnlock( FCB );
return STATUS_SUCCESS;
}
if( FCB->State == SOCKET_STATE_CLOSED ) {
SocketStateUnlock( FCB );
DestroySocket( FCB );
+1 -1
View File
@@ -262,7 +262,7 @@ NTSTATUS NTAPI UnlockAndMaybeComplete
NTSTATUS LostSocket( PIRP Irp ) {
NTSTATUS Status = STATUS_INVALID_PARAMETER;
NTSTATUS Status = STATUS_FILE_CLOSED;
AFD_DbgPrint(MIN_TRACE,("Called.\n"));
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = Status;
+1 -1
View File
@@ -449,7 +449,7 @@ PacketSocketRecvComplete(
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
if( !SocketAcquireStateLock( FCB ) ) return STATUS_UNSUCCESSFUL;
if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED;
FCB->ReceiveIrp.InFlightRequest = NULL;
+8 -8
View File
@@ -277,6 +277,10 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
(PAFD_EVENT_SELECT_INFO)LockRequest( Irp, IrpSp );
PAFD_FCB FCB = FileObject->FsContext;
if( !SocketAcquireStateLock( FCB ) ) {
return LostSocket( Irp );
}
if ( !EventSelectInfo ) {
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
0, NULL );
@@ -285,10 +289,6 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
EventSelectInfo->EventObject,
EventSelectInfo->Events));
if( !SocketAcquireStateLock( FCB ) ) {
return LostSocket( Irp );
}
FCB->EventSelectTriggers = FCB->EventsFired = 0;
if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
FCB->EventSelect = NULL;
@@ -325,15 +325,15 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Called (FCB %x)\n", FCB));
if( !SocketAcquireStateLock( FCB ) ) {
return LostSocket( Irp );
}
if ( !EnumReq ) {
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
0, NULL );
}
if( !SocketAcquireStateLock( FCB ) ) {
return LostSocket( Irp );
}
EnumReq->PollEvents = FCB->PollState;
RtlZeroMemory( EnumReq->EventStatus, sizeof(EnumReq->EventStatus) );