Skip to content

Commit 9b6f793

Browse files
committed
Using __try/__except when calling MmProbeAndLockPages.
1 parent 73cdc91 commit 9b6f793

4 files changed

Lines changed: 38 additions & 12 deletions

File tree

arch/x86/kvm/svm.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,17 +2115,19 @@ static void *nested_svm_map(struct vcpu_svm *svm, u64 gpa, PMDL *_mdl)
21152115
if (!mdl)
21162116
goto error;
21172117

2118-
MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
2118+
if (!__MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess))
2119+
goto error1;
21192120

21202121
ret = kmap(mdl);
21212122
if (!ret)
2122-
goto error1;
2123+
goto error2;
21232124

21242125
*_mdl = mdl;
21252126
return ret;
21262127

2127-
error1:
2128+
error2:
21282129
MmUnlockPages(mdl);
2130+
error1:
21292131
IoFreeMdl(mdl);
21302132
error:
21312133
kvm_inject_gp(&svm->vcpu, 0);

arch/x86/kvm/vmx.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,10 @@ static PMDL nested_get_page(struct kvm_vcpu *vcpu, gpa_t addr)
309309
if (!mdl)
310310
return NULL;
311311

312-
MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
312+
if (!__MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess)) {
313+
IoFreeMdl(mdl);
314+
return NULL;
315+
}
313316

314317
return mdl;
315318
}

ntkrutils.h

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,20 @@ static __forceinline ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
639639
return rem;
640640
}
641641

642+
/*
643+
* Wrap MmProbeAndLockPages
644+
*/
645+
static __inline bool __MmProbeAndLockPages(PMDL pmdl, KPROCESSOR_MODE mode,
646+
LOCK_OPERATION op)
647+
{
648+
__try {
649+
MmProbeAndLockPages(pmdl, mode, op);
650+
} __except (EXCEPTION_EXECUTE_HANDLER) {
651+
return false;
652+
}
653+
return true;
654+
}
655+
642656
/*
643657
Memory Management Stuffs
644658
*/
@@ -918,7 +932,10 @@ static __inline int get_user_pages_fast(size_t start, int nr_pages, int write,
918932
if (!_mdl)
919933
return 0;
920934

921-
MmProbeAndLockPages(_mdl, KernelMode, IoWriteAccess);
935+
if (!__MmProbeAndLockPages(_mdl, KernelMode, IoWriteAccess)) {
936+
IoFreeMdl(_mdl);
937+
return 0;
938+
}
922939
*mdl = _mdl;
923940

924941
return nr_pages;
@@ -949,16 +966,17 @@ static __inline size_t __copy_user(void *dst, const void *src, size_t size,
949966
int from)
950967
{
951968
PMDL lock_mdl;
952-
HANDLE handle;
953969
int clac = 0;
954970

955971
lock_mdl = IoAllocateMdl(from? src : dst, size, FALSE, FALSE, NULL);
956972
if (!lock_mdl)
957973
return size;
958-
MmProbeAndLockPages(lock_mdl, UserMode, IoWriteAccess);
959-
handle = MmSecureVirtualMemory(from? src : dst, size, PAGE_READWRITE);
960-
if (!handle)
974+
975+
if (!__MmProbeAndLockPages(lock_mdl, UserMode, IoWriteAccess)) {
976+
IoFreeMdl(lock_mdl);
961977
return size;
978+
}
979+
962980
/*
963981
* If Windows turns on SMAP, we need set AC flag before accessing
964982
* user addr. However, since we do not know Windows's logic for AC
@@ -980,7 +998,7 @@ static __inline size_t __copy_user(void *dst, const void *src, size_t size,
980998
_clac();
981999
local_irq_enable();
9821000
}
983-
MmUnsecureVirtualMemory(handle);
1001+
9841002
MmUnlockPages(lock_mdl);
9851003
IoFreeMdl(lock_mdl);
9861004
return 0;

virt/kvm/kvm_main.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,8 +1291,11 @@ static int gvm_pin_user_memory(size_t addr, struct pmem_lock *pmem_lock)
12911291
FALSE, FALSE, NULL);
12921292
if (!pmem_lock->lock_mdl)
12931293
return -1;
1294-
MmProbeAndLockPages(pmem_lock->lock_mdl, UserMode,
1295-
IoWriteAccess);
1294+
if (!__MmProbeAndLockPages(pmem_lock->lock_mdl, UserMode,
1295+
IoWriteAccess)) {
1296+
IoFreeMdl(pmem_lock->lock_mdl);
1297+
return -1;
1298+
}
12961299
return 0;
12971300
}
12981301

0 commit comments

Comments
 (0)