- Fix several cancellation races and broken checks

svn path=/trunk/; revision=54327
This commit is contained in:
Cameron Gutman 2011-11-07 00:52:32 +00:00
parent 784e19a384
commit 3eff89fe04
2 changed files with 9 additions and 12 deletions

View file

@ -133,9 +133,11 @@ NpfsFindListeningServerInstance(PNPFS_FCB Fcb)
IoAcquireCancelSpinLock(&oldIrql);
if (!Irp->Cancel)
{
(void)IoSetCancelRoutine(Irp, NULL);
IoReleaseCancelSpinLock(oldIrql);
return Waiter->Ccb;
if (IoSetCancelRoutine(Irp, NULL) != NULL)
{
IoReleaseCancelSpinLock(oldIrql);
return Waiter->Ccb;
}
}
IoReleaseCancelSpinLock(oldIrql);
}
@ -868,11 +870,7 @@ NpfsCleanup(PDEVICE_OBJECT DeviceObject,
RemoveEntryList(Entry);
tmpIrp = CONTAINING_RECORD(WaitEntry, IRP, Tail.Overlay.DriverContext);
IoAcquireCancelSpinLock(&oldIrql);
if (!tmpIrp->Cancel)
{
(void)IoSetCancelRoutine(tmpIrp, NULL);
Complete = TRUE;
}
Complete = (NULL != IoSetCancelRoutine(tmpIrp, NULL));
IoReleaseCancelSpinLock(oldIrql);
if (Complete)
{

View file

@ -57,12 +57,11 @@ NpfsAddListeningServerInstance(PIRP Irp,
KeLockMutex(&Ccb->Fcb->CcbListLock);
IoMarkIrpPending(Irp);
InsertTailList(&Ccb->Fcb->WaiterListHead, &Entry->Entry);
IoAcquireCancelSpinLock(&oldIrql);
if (!Irp->Cancel)
{
IoMarkIrpPending(Irp);
InsertTailList(&Ccb->Fcb->WaiterListHead, &Entry->Entry);
(void)IoSetCancelRoutine(Irp, NpfsListeningCancelRoutine);
IoReleaseCancelSpinLock(oldIrql);
KeUnlockMutex(&Ccb->Fcb->CcbListLock);
@ -289,7 +288,7 @@ NpfsDisconnectPipe(PNPFS_CCB Ccb)
{
RemoveEntryList(Entry);
Irp = CONTAINING_RECORD(Entry, IRP, Tail.Overlay.DriverContext);
Complete = (NULL == IoSetCancelRoutine(Irp, NULL));
Complete = (NULL != IoSetCancelRoutine(Irp, NULL));
break;
}
Entry = Entry->Flink;