Skip to content

Commit af2ac3e

Browse files
Alexei Starovoitovborkmann
authored andcommitted
bpf: Prepare bpf syscall to be used from kernel and user space.
With the help from bpfptr_t prepare relevant bpf syscall commands to be used from kernel and user space. Signed-off-by: Alexei Starovoitov <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent cdf7fb0 commit af2ac3e

File tree

5 files changed

+104
-66
lines changed

5 files changed

+104
-66
lines changed

include/linux/bpf.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <linux/sched/mm.h>
2323
#include <linux/slab.h>
2424
#include <linux/percpu-refcount.h>
25+
#include <linux/bpfptr.h>
2526

2627
struct bpf_verifier_env;
2728
struct bpf_verifier_log;
@@ -1428,7 +1429,7 @@ struct bpf_iter__bpf_map_elem {
14281429
int bpf_iter_reg_target(const struct bpf_iter_reg *reg_info);
14291430
void bpf_iter_unreg_target(const struct bpf_iter_reg *reg_info);
14301431
bool bpf_iter_prog_supported(struct bpf_prog *prog);
1431-
int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog);
1432+
int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr, struct bpf_prog *prog);
14321433
int bpf_iter_new_fd(struct bpf_link *link);
14331434
bool bpf_link_is_iter(struct bpf_link *link);
14341435
struct bpf_prog *bpf_iter_get_info(struct bpf_iter_meta *meta, bool in_stop);
@@ -1459,7 +1460,7 @@ int bpf_fd_htab_map_update_elem(struct bpf_map *map, struct file *map_file,
14591460
int bpf_fd_htab_map_lookup_elem(struct bpf_map *map, void *key, u32 *value);
14601461

14611462
int bpf_get_file_flag(int flags);
1462-
int bpf_check_uarg_tail_zero(void __user *uaddr, size_t expected_size,
1463+
int bpf_check_uarg_tail_zero(bpfptr_t uaddr, size_t expected_size,
14631464
size_t actual_size);
14641465

14651466
/* memcpy that is used with 8-byte aligned pointers, power-of-8 size and
@@ -1479,8 +1480,7 @@ static inline void bpf_long_memcpy(void *dst, const void *src, u32 size)
14791480
}
14801481

14811482
/* verify correctness of eBPF program */
1482-
int bpf_check(struct bpf_prog **fp, union bpf_attr *attr,
1483-
union bpf_attr __user *uattr);
1483+
int bpf_check(struct bpf_prog **fp, union bpf_attr *attr, bpfptr_t uattr);
14841484

14851485
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
14861486
void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth);

kernel/bpf/bpf_iter.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -473,34 +473,35 @@ bool bpf_link_is_iter(struct bpf_link *link)
473473
return link->ops == &bpf_iter_link_lops;
474474
}
475475

476-
int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
476+
int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr,
477+
struct bpf_prog *prog)
477478
{
478-
union bpf_iter_link_info __user *ulinfo;
479479
struct bpf_link_primer link_primer;
480480
struct bpf_iter_target_info *tinfo;
481481
union bpf_iter_link_info linfo;
482482
struct bpf_iter_link *link;
483483
u32 prog_btf_id, linfo_len;
484484
bool existed = false;
485+
bpfptr_t ulinfo;
485486
int err;
486487

487488
if (attr->link_create.target_fd || attr->link_create.flags)
488489
return -EINVAL;
489490

490491
memset(&linfo, 0, sizeof(union bpf_iter_link_info));
491492

492-
ulinfo = u64_to_user_ptr(attr->link_create.iter_info);
493+
ulinfo = make_bpfptr(attr->link_create.iter_info, uattr.is_kernel);
493494
linfo_len = attr->link_create.iter_info_len;
494-
if (!ulinfo ^ !linfo_len)
495+
if (bpfptr_is_null(ulinfo) ^ !linfo_len)
495496
return -EINVAL;
496497

497-
if (ulinfo) {
498+
if (!bpfptr_is_null(ulinfo)) {
498499
err = bpf_check_uarg_tail_zero(ulinfo, sizeof(linfo),
499500
linfo_len);
500501
if (err)
501502
return err;
502503
linfo_len = min_t(u32, linfo_len, sizeof(linfo));
503-
if (copy_from_user(&linfo, ulinfo, linfo_len))
504+
if (copy_from_bpfptr(&linfo, ulinfo, linfo_len))
504505
return -EFAULT;
505506
}
506507

0 commit comments

Comments
 (0)