aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r--kernel/bpf/syscall.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index b7c585838c72..7f1410d6fbe9 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -2315,6 +2315,28 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
2315 } 2315 }
2316 } 2316 }
2317 2317
2318 ulen = info.nr_prog_tags;
2319 info.nr_prog_tags = prog->aux->func_cnt ? : 1;
2320 if (ulen) {
2321 __u8 __user (*user_prog_tags)[BPF_TAG_SIZE];
2322 u32 i;
2323
2324 user_prog_tags = u64_to_user_ptr(info.prog_tags);
2325 ulen = min_t(u32, info.nr_prog_tags, ulen);
2326 if (prog->aux->func_cnt) {
2327 for (i = 0; i < ulen; i++) {
2328 if (copy_to_user(user_prog_tags[i],
2329 prog->aux->func[i]->tag,
2330 BPF_TAG_SIZE))
2331 return -EFAULT;
2332 }
2333 } else {
2334 if (copy_to_user(user_prog_tags[0],
2335 prog->tag, BPF_TAG_SIZE))
2336 return -EFAULT;
2337 }
2338 }
2339
2318done: 2340done:
2319 if (copy_to_user(uinfo, &info, info_len) || 2341 if (copy_to_user(uinfo, &info, info_len) ||
2320 put_user(info_len, &uattr->info.info_len)) 2342 put_user(info_len, &uattr->info.info_len))