diff options
| -rw-r--r-- | arch/x86/kernel/kprobes/core.c | 9 | ||||
| -rw-r--r-- | kernel/kprobes.c | 2 | 
2 files changed, 10 insertions, 1 deletions
| diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index 5b2bbfbb3712..6b877807598b 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c @@ -52,6 +52,7 @@  #include <linux/ftrace.h>  #include <linux/frame.h>  #include <linux/kasan.h> +#include <linux/moduleloader.h>  #include <asm/text-patching.h>  #include <asm/cacheflush.h> @@ -417,6 +418,14 @@ static void prepare_boost(struct kprobe *p, struct insn *insn)  	}  } +/* Recover page to RW mode before releasing it */ +void free_insn_page(void *page) +{ +	set_memory_nx((unsigned long)page & PAGE_MASK, 1); +	set_memory_rw((unsigned long)page & PAGE_MASK, 1); +	module_memfree(page); +} +  static int arch_copy_kprobe(struct kprobe *p)  {  	struct insn insn; diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 2d2d3a568e4e..adfe3b4cfe05 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -122,7 +122,7 @@ static void *alloc_insn_page(void)  	return module_alloc(PAGE_SIZE);  } -static void free_insn_page(void *page) +void __weak free_insn_page(void *page)  {  	module_memfree(page);  } | 
