diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r-- | kernel/bpf/syscall.c | 22 |
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 | |||
2318 | done: | 2340 | done: |
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)) |