Author: cgutman Date: Mon Nov 7 01:37:35 2011 New Revision: 54328
URL: http://svn.reactos.org/svn/reactos?rev=54328&view=rev Log: [NPFS] - Fix a potential CCB state inconsistency if the IRP is canceled before adding it to the pending list - Don't wait if the IRP has been canceled - Preserve the return status of NpfsAddListeningServerInstance
Modified: trunk/reactos/drivers/filesystems/npfs/fsctrl.c
Modified: trunk/reactos/drivers/filesystems/npfs/fsctrl.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs/fs... ============================================================================== --- trunk/reactos/drivers/filesystems/npfs/fsctrl.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/npfs/fsctrl.c [iso-8859-1] Mon Nov 7 01:37:35 2011 @@ -60,6 +60,7 @@ IoAcquireCancelSpinLock(&oldIrql); if (!Irp->Cancel) { + Ccb->PipeState = FILE_PIPE_LISTENING_STATE; IoMarkIrpPending(Irp); InsertTailList(&Ccb->Fcb->WaiterListHead, &Entry->Entry); (void)IoSetCancelRoutine(Irp, NpfsListeningCancelRoutine); @@ -174,21 +175,17 @@ /* no listening client fcb found */ DPRINT("No listening client fcb found -- waiting for client\n");
- Ccb->PipeState = FILE_PIPE_LISTENING_STATE; - Status = NpfsAddListeningServerInstance(Irp, Ccb);
KeUnlockMutex(&Fcb->CcbListLock);
- if (Flags & FO_SYNCHRONOUS_IO) - { - Status = KeWaitForSingleObject(&Ccb->ConnectEvent, + if ((Status == STATUS_PENDING) && (Flags & FO_SYNCHRONOUS_IO)) + { + KeWaitForSingleObject(&Ccb->ConnectEvent, UserRequest, Irp->RequestorMode, (Flags & FO_ALERTABLE_IO), NULL); - if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) || (Status == STATUS_ALERTED)) - Status = STATUS_CANCELLED; }
DPRINT("NpfsConnectPipe() done (Status %lx)\n", Status);