diff options
Diffstat (limited to 'kernel/trace/bpf_trace.c')
| -rw-r--r-- | kernel/trace/bpf_trace.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 9a050e36dc6c..1f4b07da327a 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -900,13 +900,23 @@ static const struct bpf_func_proto bpf_send_signal_thread_proto = {  BPF_CALL_3(bpf_d_path, struct path *, path, char *, buf, u32, sz)  { +	struct path copy;  	long len;  	char *p;  	if (!sz)  		return 0; -	p = d_path(path, buf, sz); +	/* +	 * The path pointer is verified as trusted and safe to use, +	 * but let's double check it's valid anyway to workaround +	 * potentially broken verifier. +	 */ +	len = copy_from_kernel_nofault(©, path, sizeof(*path)); +	if (len < 0) +		return len; + +	p = d_path(©, buf, sz);  	if (IS_ERR(p)) {  		len = PTR_ERR(p);  	} else {  |