Message ID | 20211016124806.1547989-3-houtao1@huawei.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | introduce dummy BPF STRUCT_OPS | expand |
On Sat, Oct 16, 2021 at 08:48:03PM +0800, Hou Tao wrote: > Factor out two helpers to check the read access of ctx for BTF > function. bpf_check_btf_func_arg_access() is used to check the > read access to argument is valid, and bpf_check_btf_func_ctx_access() > also checks whether the btf type of argument is valid besides > the checking of arguments read. bpf_check_btf_func_ctx_access() > will be used by the following patch. > > Signed-off-by: Hou Tao <houtao1@huawei.com> > --- > include/linux/bpf.h | 27 +++++++++++++++++++++++++++ > kernel/trace/bpf_trace.c | 16 ++-------------- > net/ipv4/bpf_tcp_ca.c | 9 +-------- > 3 files changed, 30 insertions(+), 22 deletions(-) > > diff --git a/include/linux/bpf.h b/include/linux/bpf.h > index b7c1e2bc93f7..b503306da2ab 100644 > --- a/include/linux/bpf.h > +++ b/include/linux/bpf.h > @@ -1648,6 +1648,33 @@ bool bpf_prog_test_check_kfunc_call(u32 kfunc_id, struct module *owner); > bool btf_ctx_access(int off, int size, enum bpf_access_type type, > const struct bpf_prog *prog, > struct bpf_insn_access_aux *info); > + > +/* > + * The maximum number of BTF function arguments is MAX_BPF_FUNC_ARGS. > + * And only aligned read is allowed. > + */ > +static inline bool bpf_check_btf_func_arg_access(int off, int size, > + enum bpf_access_type type) Refactoring makes sense but naming could be hard to figure out here. "_btf_func_arg" part is confusing with other btf_check_func_arg functions in btf.c. e.g. it is checking an arg of a bpf subprog or checking a bpf_prog's ctx here? The name sounds former but it is actually the latter here (i.e. checking ctx). It is a ctx with an array of __u64 for tracing. How about bpf_tracing_ctx_access()? > +{ > + if (off < 0 || off >= sizeof(__u64) * MAX_BPF_FUNC_ARGS) > + return false; > + if (type != BPF_READ) > + return false; > + if (off % size != 0) > + return false; > + return true; > +} > + > +static inline bool bpf_check_btf_func_ctx_access(int off, int size, > + enum bpf_access_type type, > + const struct bpf_prog *prog, > + struct bpf_insn_access_aux *info) and may be bpf_tracing_btf_ctx_access() here? > +{ > + if (!bpf_check_btf_func_arg_access(off, size, type)) > + return false; > + return btf_ctx_access(off, size, type, prog, info); > +}
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index b7c1e2bc93f7..b503306da2ab 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1648,6 +1648,33 @@ bool bpf_prog_test_check_kfunc_call(u32 kfunc_id, struct module *owner); bool btf_ctx_access(int off, int size, enum bpf_access_type type, const struct bpf_prog *prog, struct bpf_insn_access_aux *info); + +/* + * The maximum number of BTF function arguments is MAX_BPF_FUNC_ARGS. + * And only aligned read is allowed. + */ +static inline bool bpf_check_btf_func_arg_access(int off, int size, + enum bpf_access_type type) +{ + if (off < 0 || off >= sizeof(__u64) * MAX_BPF_FUNC_ARGS) + return false; + if (type != BPF_READ) + return false; + if (off % size != 0) + return false; + return true; +} + +static inline bool bpf_check_btf_func_ctx_access(int off, int size, + enum bpf_access_type type, + const struct bpf_prog *prog, + struct bpf_insn_access_aux *info) +{ + if (!bpf_check_btf_func_arg_access(off, size, type)) + return false; + return btf_ctx_access(off, size, type, prog, info); +} + int btf_struct_access(struct bpf_verifier_log *log, const struct btf *btf, const struct btf_type *t, int off, int size, enum bpf_access_type atype, diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 6b3153841a33..f2858ef32e16 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1644,13 +1644,7 @@ static bool raw_tp_prog_is_valid_access(int off, int size, const struct bpf_prog *prog, struct bpf_insn_access_aux *info) { - if (off < 0 || off >= sizeof(__u64) * MAX_BPF_FUNC_ARGS) - return false; - if (type != BPF_READ) - return false; - if (off % size != 0) - return false; - return true; + return bpf_check_btf_func_arg_access(off, size, type); } static bool tracing_prog_is_valid_access(int off, int size, @@ -1658,13 +1652,7 @@ static bool tracing_prog_is_valid_access(int off, int size, const struct bpf_prog *prog, struct bpf_insn_access_aux *info) { - if (off < 0 || off >= sizeof(__u64) * MAX_BPF_FUNC_ARGS) - return false; - if (type != BPF_READ) - return false; - if (off % size != 0) - return false; - return btf_ctx_access(off, size, type, prog, info); + return bpf_check_btf_func_ctx_access(off, size, type, prog, info); } int __weak bpf_prog_test_run_tracing(struct bpf_prog *prog, diff --git a/net/ipv4/bpf_tcp_ca.c b/net/ipv4/bpf_tcp_ca.c index 57709ac09fb2..1eccc4974382 100644 --- a/net/ipv4/bpf_tcp_ca.c +++ b/net/ipv4/bpf_tcp_ca.c @@ -81,14 +81,7 @@ static bool bpf_tcp_ca_is_valid_access(int off, int size, const struct bpf_prog *prog, struct bpf_insn_access_aux *info) { - if (off < 0 || off >= sizeof(__u64) * MAX_BPF_FUNC_ARGS) - return false; - if (type != BPF_READ) - return false; - if (off % size != 0) - return false; - - if (!btf_ctx_access(off, size, type, prog, info)) + if (!bpf_check_btf_func_ctx_access(off, size, type, prog, info)) return false; if (info->reg_type == PTR_TO_BTF_ID && info->btf_id == sock_id)
Factor out two helpers to check the read access of ctx for BTF function. bpf_check_btf_func_arg_access() is used to check the read access to argument is valid, and bpf_check_btf_func_ctx_access() also checks whether the btf type of argument is valid besides the checking of arguments read. bpf_check_btf_func_ctx_access() will be used by the following patch. Signed-off-by: Hou Tao <houtao1@huawei.com> --- include/linux/bpf.h | 27 +++++++++++++++++++++++++++ kernel/trace/bpf_trace.c | 16 ++-------------- net/ipv4/bpf_tcp_ca.c | 9 +-------- 3 files changed, 30 insertions(+), 22 deletions(-)