diff options
Diffstat (limited to 'kernel/trace/bpf_trace.c')
| -rw-r--r-- | kernel/trace/bpf_trace.c | 20 | 
1 files changed, 19 insertions, 1 deletions
| diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index a7264b2c17ad..868008f56fec 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2853,6 +2853,17 @@ static int get_modules_for_addrs(struct module ***mods, unsigned long *addrs, u3  	return arr.mods_cnt;  } +static int addrs_check_error_injection_list(unsigned long *addrs, u32 cnt) +{ +	u32 i; + +	for (i = 0; i < cnt; i++) { +		if (!within_error_injection_list(addrs[i])) +			return -EINVAL; +	} +	return 0; +} +  int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)  {  	struct bpf_kprobe_multi_link *link = NULL; @@ -2930,6 +2941,11 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr  			goto error;  	} +	if (prog->kprobe_override && addrs_check_error_injection_list(addrs, cnt)) { +		err = -EINVAL; +		goto error; +	} +  	link = kzalloc(sizeof(*link), GFP_KERNEL);  	if (!link) {  		err = -ENOMEM; @@ -3207,8 +3223,10 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr  		rcu_read_lock();  		task = get_pid_task(find_vpid(pid), PIDTYPE_PID);  		rcu_read_unlock(); -		if (!task) +		if (!task) { +			err = -ESRCH;  			goto error_path_put; +		}  	}  	err = -ENOMEM; |