Fix a race condition in quantum code. Spotted by Shmuel Baron.
Modified: trunk/reactos/ntoskrnl/ke/clock.c
_____
Modified: trunk/reactos/ntoskrnl/ke/clock.c
--- trunk/reactos/ntoskrnl/ke/clock.c 2005-07-30 19:31:52 UTC (rev
16903)
+++ trunk/reactos/ntoskrnl/ke/clock.c 2005-07-30 23:06:46 UTC (rev
16904)
@@ -305,14 +305,22 @@
/* FIXME: Do DPC rate adjustments */
+ /*
+ * RACE CONDITION WARNING. If one stays at DISPATCH_LEVEL for a long
+ * time the DPC routine which checks for quantum end will not be
executed
+ * and decrementing the quantum here would result in overflow.
+ */
+ if (CurrentThread->Quantum < 0)
+ return;
+
/*
* If we're at end of quantum request software interrupt. The rest
* is handled in KiDispatchInterrupt.
*/
if ((CurrentThread->Quantum -= 3) <= 0)
{
- Prcb->QuantumEnd = TRUE;
- HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
+ Prcb->QuantumEnd = TRUE;
+ HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
}
}