Add missing state transition lock
When we are transitioning to a state that suspends some operations, we must get an exclusive transition lock to wait for all operations that have a shared transition lock. And TunHaltEx() is no exception. Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
60e103cad3
commit
70fcfdc85d
2
wintun.c
2
wintun.c
@ -1332,7 +1332,9 @@ static void TunHaltEx(NDIS_HANDLE MiniportAdapterContext, NDIS_HALT_ACTION HaltA
|
|||||||
ASSERT(!ctx->PnPNotifications.Handle);
|
ASSERT(!ctx->PnPNotifications.Handle);
|
||||||
ASSERT(!InterlockedGet64(&ctx->ActiveTransactionCount)); /* Adapter should not be halted if it wasn't fully paused first. */
|
ASSERT(!InterlockedGet64(&ctx->ActiveTransactionCount)); /* Adapter should not be halted if it wasn't fully paused first. */
|
||||||
|
|
||||||
|
KIRQL irql = ExAcquireSpinLockExclusive(&ctx->TransitionLock);
|
||||||
InterlockedAnd(&ctx->Flags, ~TUN_FLAGS_PRESENT);
|
InterlockedAnd(&ctx->Flags, ~TUN_FLAGS_PRESENT);
|
||||||
|
ExReleaseSpinLockExclusive(&ctx->TransitionLock, irql);
|
||||||
|
|
||||||
for (IRP *pending_irp; (pending_irp = IoCsqRemoveNextIrp(&ctx->Device.ReadQueue.Csq, NULL)) != NULL;)
|
for (IRP *pending_irp; (pending_irp = IoCsqRemoveNextIrp(&ctx->Device.ReadQueue.Csq, NULL)) != NULL;)
|
||||||
TunCompleteRequest(ctx, pending_irp, STATUS_FILE_FORCED_CLOSED, IO_NO_INCREMENT);
|
TunCompleteRequest(ctx, pending_irp, STATUS_FILE_FORCED_CLOSED, IO_NO_INCREMENT);
|
||||||
|
Loading…
Reference in New Issue
Block a user