diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-06-20 17:02:00 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-06-20 15:17:36 +0000 |
commit | dea5bfa2d2f34ac6f5144a433b964f30f27c9de1 (patch) | |
tree | 6b09020976e848a87faa2868add793b6ada3d1ba | |
parent | Adopt "Tun" namespace at global AdapterCount variable (diff) | |
download | wintun-dea5bfa2d2f34ac6f5144a433b964f30f27c9de1.tar.xz wintun-dea5bfa2d2f34ac6f5144a433b964f30f27c9de1.zip |
Synchronize accesses to MiniportAdapterHandle
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | wintun.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -870,8 +870,9 @@ static NTSTATUS TunDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp) BOOLEAN last_handle = InterlockedDecrement64(&ctx->Device.RefCount) <= 0; ExReleaseSpinLockExclusive(&ctx->TransitionLock, irql); if (last_handle) { - if (ctx->MiniportAdapterHandle) - TunIndicateStatus(ctx->MiniportAdapterHandle, MediaConnectStateDisconnected); + NDIS_HANDLE handle = InterlockedGetPointer(&ctx->MiniportAdapterHandle); + if (handle) + TunIndicateStatus(handle, MediaConnectStateDisconnected); TunQueueClear(ctx, NDIS_STATUS_MEDIA_DISCONNECTED); } IoReleaseRemoveLock(&ctx->Device.RemoveLock, stack->FileObject); @@ -1306,7 +1307,7 @@ static void TunHaltEx(NDIS_HANDLE MiniportAdapterContext, NDIS_HALT_ACTION HaltA NdisFreeNetBufferListPool(ctx->NBLPool); /* MiniportAdapterHandle must not be used in TunDispatch(). After TunHaltEx() returns it is invalidated. */ - ctx->MiniportAdapterHandle = NULL; + InterlockedExchangePointer(&ctx->MiniportAdapterHandle, NULL); ASSERT(InterlockedGet64(&TunAdapterCount) > 0); if (InterlockedDecrement64(&TunAdapterCount) <= 0) |