On Wed, Jan 11, 2017 at 4:23 PM, Konstantin Bukin <[email protected]>
wrote:
> Here is a diff against kernel 4.9.2:
>
> build-test1:linux-4.9.2$git diff
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index c201017..64516be 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -327,6 +327,7 @@ extern const struct bpf_func_proto
> bpf_get_current_comm_proto;
> extern const struct bpf_func_proto bpf_skb_vlan_push_proto;
> extern const struct bpf_func_proto bpf_skb_vlan_pop_proto;
> extern const struct bpf_func_proto bpf_get_stackid_proto;
> +extern const struct bpf_func_proto bpf_strnlen_proto;
>
> /* Shared helpers among cBPF and eBPF. */
> void bpf_user_rnd_init_once(void);
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index f09c70b..38c6400 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -426,6 +426,16 @@ enum bpf_func_id {
> */
> BPF_FUNC_set_hash_invalid,
>
> + /**
> + * bpf_strnlen(str, size)
> + * Get the size of a user string INCLUDING final NUL
> + * @str: The string to measure.
> + * @count: Maximum count (including NUL character)
> + *
> + * see comments for strnlen_user(const char __user *str, long count)
> + */
> + BPF_FUNC_strnlen,
> +
> __BPF_FUNC_MAX_ID,
> };
>
> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
> index aa6d981..ab04742 100644
> --- a/kernel/bpf/core.c
> +++ b/kernel/bpf/core.c
> @@ -1048,6 +1048,7 @@ const struct bpf_func_proto bpf_ktime_get_ns_proto
> __weak;
> const struct bpf_func_proto bpf_get_current_pid_tgid_proto __weak;
> const struct bpf_func_proto bpf_get_current_uid_gid_proto __weak;
> const struct bpf_func_proto bpf_get_current_comm_proto __weak;
> +const struct bpf_func_proto bpf_strnlen __weak;
>
> const struct bpf_func_proto * __weak bpf_get_trace_printk_proto(void)
> {
> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
> index 3991840..ec64244 100644
> --- a/kernel/bpf/helpers.c
> +++ b/kernel/bpf/helpers.c
> @@ -120,6 +120,17 @@ const struct bpf_func_proto
> bpf_get_current_pid_tgid_proto = {
> .ret_type = RET_INTEGER,
> };
>
> +BPF_CALL_2(bpf_strnlen, const char __user *, buf, u32, size)
> +{
> + return strnlen_user(buf, size);
> +}
>
> unfortunately it's not so straightforward, since
strnlen_user() can only be called on user pointer in user context.
access_ok() macro just recently got
WARN_ON_IN_IRQ() warning to prevent such misuse.
btw, verifier just recently got support for variable length
bpf_probe_read(buf, len, unsafe_ptr)
where 'buf' can be a pointer inside map's value
and 'len' can be capped variable.
I think we need to solve it more generically than
adding strlen/strcpy helpers.
>
> +
> +const struct bpf_func_proto bpf_strnlen_proto = {
> + .func = bpf_strnlen,
> + .gpl_only = false,
> + .ret_type = RET_INTEGER,
> +};
> +
>
>
_______________________________________________
iovisor-dev mailing list
[email protected]
https://lists.iovisor.org/mailman/listinfo/iovisor-dev