diff options
Diffstat (limited to 'kernel/kprobes.c')
| -rw-r--r-- | kernel/kprobes.c | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 80697e5e03e4..ca9d834d0b84 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -1562,6 +1562,7 @@ static int check_kprobe_address_safe(struct kprobe *p,  	/* Ensure it is not in reserved area nor out of text */  	if (!(core_kernel_text((unsigned long) p->addr) ||  	    is_module_text_address((unsigned long) p->addr)) || +	    in_gate_area_no_mm((unsigned long) p->addr) ||  	    within_kprobe_blacklist((unsigned long) p->addr) ||  	    jump_label_text_reserved(p->addr, p->addr) ||  	    static_call_text_reserved(p->addr, p->addr) || @@ -1707,11 +1708,12 @@ static struct kprobe *__disable_kprobe(struct kprobe *p)  		/* Try to disarm and disable this/parent probe */  		if (p == orig_p || aggr_kprobe_disabled(orig_p)) {  			/* -			 * If 'kprobes_all_disarmed' is set, 'orig_p' -			 * should have already been disarmed, so -			 * skip unneed disarming process. +			 * Don't be lazy here.  Even if 'kprobes_all_disarmed' +			 * is false, 'orig_p' might not have been armed yet. +			 * Note arm_all_kprobes() __tries__ to arm all kprobes +			 * on the best effort basis.  			 */ -			if (!kprobes_all_disarmed) { +			if (!kprobes_all_disarmed && !kprobe_disabled(orig_p)) {  				ret = disarm_kprobe(orig_p, true);  				if (ret) {  					p->flags &= ~KPROBE_FLAG_DISABLED;  | 
