On Fri, Aug 21, 2020 at 12:11 PM Yonghong Song <yhs@xxxxxx> wrote: > > Commit f2e10bff16a0 ("bpf: Add support for BPF_OBJ_GET_INFO_BY_FD for bpf_link") > added link query for raw_tp. One of fields in link_info is to > fill a user buffer with tp_name. The Scurrent checking only > declares "ulen && !ubuf" as invalid. So "!ulen && ubuf" will be > valid. Later on, we do "copy_to_user(ubuf, tp_name, ulen - 1)" which > may overwrite user memory incorrectly. > > This patch fixed the problem by disallowing "!ulen && ubuf" case as well. > > Fixes: f2e10bff16a0 ("bpf: Add support for BPF_OBJ_GET_INFO_BY_FD for bpf_link") > Cc: Andrii Nakryiko <andriin@xxxxxx> > Signed-off-by: Yonghong Song <yhs@xxxxxx> > --- > kernel/bpf/syscall.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 86299a292214..ac6c784c0576 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -2634,7 +2634,7 @@ static int bpf_raw_tp_link_fill_link_info(const struct bpf_link *link, > u32 ulen = info->raw_tracepoint.tp_name_len; > size_t tp_len = strlen(tp_name); > > - if (ulen && !ubuf) > + if (!ulen ^ !ubuf) > return -EINVAL; I think my original idea was to allow ulen == 0 && ubuf != NULL as a still valid way to get real ulen, but it's clearly wrong with ulen-1 below. So instead of special-casing ulen==0 for the case I wanted to support, it's easier to disallow ulen==0 && ubuf!=NULL. So thanks for the fix! Acked-by: Andrii Nakryiko <andriin@xxxxxx> > > info->raw_tracepoint.tp_name_len = tp_len + 1; > -- > 2.24.1 >