From 682fe1a935dceceb6091f8b7c0de1c63a42d6ab2 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Wed, 26 Aug 2015 11:07:44 +0300 Subject: [PATCH] [FIX] Check for atomic context in swap_handle_mm_fault Now we return an error instead of generating page fault in atomic context. Change-Id: I1d4654142c4f22da500c2d3981509f631cb95fd5 Signed-off-by: Vyacheslav Cherkashin --- kprobe/swap_kprobes_deps.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/kprobe/swap_kprobes_deps.c b/kprobe/swap_kprobes_deps.c index 5c4bef4..7a8a008 100644 --- a/kprobe/swap_kprobes_deps.c +++ b/kprobe/swap_kprobes_deps.c @@ -208,15 +208,25 @@ DECLARE_MOD_DEP_WRAPPER(swap_handle_mm_fault, int, struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, int write_access) -IMP_MOD_DEP_WRAPPER(handle_mm_fault, mm, vma, address, write_access) -#endif -#else +{ + if (in_atomic()) + return VM_FAULT_ERROR | VM_FAULT_OOM; + + IMP_MOD_DEP_WRAPPER(handle_mm_fault, mm, vma, address, write_access) +} +#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) */ +#else /* LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30) */ DECLARE_MOD_DEP_WRAPPER(swap_handle_mm_fault, int, struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags) -IMP_MOD_DEP_WRAPPER(handle_mm_fault, mm, vma, address, flags) -#endif +{ + if (in_atomic()) + return VM_FAULT_ERROR | VM_FAULT_OOM; + + IMP_MOD_DEP_WRAPPER(handle_mm_fault, mm, vma, address, flags) +} +#endif /* LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30) */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) DECLARE_MOD_DEP_WRAPPER(swap_get_gate_vma, -- 2.7.4