diff options
Diffstat (limited to 'kernel/trace/bpf_trace.c')
| -rw-r--r-- | kernel/trace/bpf_trace.c | 12 | 
1 files changed, 4 insertions, 8 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index f5154c051d2c..d1daeab1bbc1 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3295,7 +3295,7 @@ static int uprobe_prog_run(struct bpf_uprobe *uprobe,  	struct bpf_run_ctx *old_run_ctx;  	int err = 0; -	if (link->task && current != link->task) +	if (link->task && current->mm != link->task->mm)  		return 0;  	if (sleepable) @@ -3396,8 +3396,9 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr  	upath = u64_to_user_ptr(attr->link_create.uprobe_multi.path);  	uoffsets = u64_to_user_ptr(attr->link_create.uprobe_multi.offsets);  	cnt = attr->link_create.uprobe_multi.cnt; +	pid = attr->link_create.uprobe_multi.pid; -	if (!upath || !uoffsets || !cnt) +	if (!upath || !uoffsets || !cnt || pid < 0)  		return -EINVAL;  	if (cnt > MAX_UPROBE_MULTI_CNT)  		return -E2BIG; @@ -3421,11 +3422,8 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr  		goto error_path_put;  	} -	pid = attr->link_create.uprobe_multi.pid;  	if (pid) { -		rcu_read_lock(); -		task = get_pid_task(find_vpid(pid), PIDTYPE_PID); -		rcu_read_unlock(); +		task = get_pid_task(find_vpid(pid), PIDTYPE_TGID);  		if (!task) {  			err = -ESRCH;  			goto error_path_put; @@ -3519,7 +3517,6 @@ static u64 bpf_uprobe_multi_entry_ip(struct bpf_run_ctx *ctx)  }  #endif /* CONFIG_UPROBES */ -#ifdef CONFIG_FPROBE  __bpf_kfunc_start_defs();  __bpf_kfunc bool bpf_session_is_return(void) @@ -3568,4 +3565,3 @@ static int __init bpf_kprobe_multi_kfuncs_init(void)  }  late_initcall(bpf_kprobe_multi_kfuncs_init); -#endif  |