aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-06-20 17:02:00 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-06-20 15:17:36 +0000
commitdea5bfa2d2f34ac6f5144a433b964f30f27c9de1 (patch)
tree6b09020976e848a87faa2868add793b6ada3d1ba
parentAdopt "Tun" namespace at global AdapterCount variable (diff)
downloadwintun-dea5bfa2d2f34ac6f5144a433b964f30f27c9de1.tar.xz
wintun-dea5bfa2d2f34ac6f5144a433b964f30f27c9de1.zip
Synchronize accesses to MiniportAdapterHandle
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--wintun.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/wintun.c b/wintun.c
index 737d670..8476533 100644
--- a/wintun.c
+++ b/wintun.c
@@ -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)