From 945a5972a9c2276c74b87d13b9306cdf5caa3a29 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 7 Nov 2011 01:37:35 +0000 Subject: [PATCH] [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 svn path=/trunk/; revision=54328 --- reactos/drivers/filesystems/npfs/fsctrl.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/filesystems/npfs/fsctrl.c b/reactos/drivers/filesystems/npfs/fsctrl.c index f9f1fee945c..8bd4a1a9174 100644 --- a/reactos/drivers/filesystems/npfs/fsctrl.c +++ b/reactos/drivers/filesystems/npfs/fsctrl.c @@ -60,6 +60,7 @@ NpfsAddListeningServerInstance(PIRP Irp, 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 @@ NpfsConnectPipe(PIRP Irp, /* 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) + if ((Status == STATUS_PENDING) && (Flags & FO_SYNCHRONOUS_IO)) { - Status = KeWaitForSingleObject(&Ccb->ConnectEvent, + 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);