diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-06-26 19:25:03 +0000 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-07-03 08:50:30 +0000 |
commit | 88bde5b28ecaea4a937f87eba43ccbc903dd6dc0 (patch) | |
tree | c9a02fc86abcadb63589758f2478dd602be1247a | |
parent | Separate out MJ_CLOSE (diff) | |
download | wintun-88bde5b28ecaea4a937f87eba43ccbc903dd6dc0.tar.xz wintun-88bde5b28ecaea4a937f87eba43ccbc903dd6dc0.zip |
Correct and simplify page locking
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | wintun.c | 40 |
1 files changed, 18 insertions, 22 deletions
@@ -301,35 +301,31 @@ TunMapUbuffer(_Inout_ TUN_MAPPED_UBUFFER *MappedBuffer, _In_ VOID *UserAddress, return STATUS_SUCCESS; return STATUS_ALREADY_INITIALIZED; } + + MappedBuffer->Mdl = IoAllocateMdl(UserAddress, Size, FALSE, FALSE, NULL); + if (!MappedBuffer->Mdl) + return STATUS_INSUFFICIENT_RESOURCES; try { - ProbeForWrite(UserAddress, Size, 1); - ProbeForRead(UserAddress, Size, 1); - - MappedBuffer->Mdl = IoAllocateMdl(UserAddress, Size, FALSE, FALSE, NULL); - if (!MappedBuffer->Mdl) - return STATUS_INSUFFICIENT_RESOURCES; - MmProbeAndLockPages(MappedBuffer->Mdl, KernelMode, IoWriteAccess); - MappedBuffer->KernelAddress = - MmGetSystemAddressForMdlSafe(MappedBuffer->Mdl, NormalPagePriority | MdlMappingNoExecute); - if (!MappedBuffer->KernelAddress) - { - IoFreeMdl(MappedBuffer->Mdl); - MappedBuffer->Mdl = NULL; - return STATUS_INSUFFICIENT_RESOURCES; - } - MappedBuffer->UserAddress = UserAddress; - MappedBuffer->Size = Size; + MmProbeAndLockPages(MappedBuffer->Mdl, UserMode, IoWriteAccess); } except(EXCEPTION_EXECUTE_HANDLER) { - if (MappedBuffer->Mdl) - { - IoFreeMdl(MappedBuffer->Mdl); - MappedBuffer->Mdl = NULL; - } + IoFreeMdl(MappedBuffer->Mdl); + MappedBuffer->Mdl = NULL; return STATUS_INVALID_USER_BUFFER; } + MappedBuffer->KernelAddress = + MmGetSystemAddressForMdlSafe(MappedBuffer->Mdl, NormalPagePriority | MdlMappingNoExecute); + if (!MappedBuffer->KernelAddress) + { + MmUnlockPages(MappedBuffer->Mdl); + IoFreeMdl(MappedBuffer->Mdl); + MappedBuffer->Mdl = NULL; + return STATUS_INSUFFICIENT_RESOURCES; + } + MappedBuffer->UserAddress = UserAddress; + MappedBuffer->Size = Size; return STATUS_SUCCESS; } |