Message ID | 20200519134449.1466624-12-hch@lst.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [01/20] maccess: unexport probe_kernel_write and probe_user_write | expand |
On Tue, May 19, 2020 at 6:45 AM Christoph Hellwig <hch@lst.de> wrote: > > + switch (fmt_ptype) { > + case 's': > +#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE > + strncpy_from_unsafe(buf, unsafe_ptr, bufsz); > + break; > +#endif > + case 'k': > + strncpy_from_kernel_nofault(buf, unsafe_ptr, bufsz); > + break; That 's' case needs a "fallthrough;" for the overlapping case, methinks. Otherwise you'll get warnings. Linus
On Tue, May 19, 2020 at 09:07:55AM -0700, Linus Torvalds wrote: > On Tue, May 19, 2020 at 6:45 AM Christoph Hellwig <hch@lst.de> wrote: > > > > + switch (fmt_ptype) { > > + case 's': > > +#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE > > + strncpy_from_unsafe(buf, unsafe_ptr, bufsz); > > + break; > > +#endif > > + case 'k': > > + strncpy_from_kernel_nofault(buf, unsafe_ptr, bufsz); > > + break; > > That 's' case needs a "fallthrough;" for the overlapping case, > methinks. Otherwise you'll get warnings. I don't think we need it as the case of case 'a': case 'b': do_stuff(); break; has always been fine even with the fallthough warnings. And the rest of the stuff gets removed by cpp..
On Tue, May 19, 2020 at 9:14 AM Christoph Hellwig <hch@lst.de> wrote: > > I don't think we need it as the case of > > case 'a': > case 'b': > do_stuff(); > break; > > has always been fine even with the fallthough warnings. And the > rest of the stuff gets removed by cpp.. You're right. I read it as a fallthrough because as a human it looks like there's code in there between, but yeah, the compiler won't actually ever see it. So scratch that objection. Linus
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index f5231ffea85b9..9d4080590f711 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -321,6 +321,28 @@ static const struct bpf_func_proto *bpf_get_probe_write_proto(void) return &bpf_probe_write_user_proto; } +static void bpf_trace_copy_string(char *buf, void *unsafe_ptr, char fmt_ptype, + size_t bufsz) +{ + void __user *user_ptr = (__force void __user *)unsafe_ptr; + + buf[0] = 0; + + switch (fmt_ptype) { + case 's': +#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE + strncpy_from_unsafe(buf, unsafe_ptr, bufsz); + break; +#endif + case 'k': + strncpy_from_kernel_nofault(buf, unsafe_ptr, bufsz); + break; + case 'u': + strncpy_from_user_nofault(buf, user_ptr, bufsz); + break; + } +} + /* * Only limited trace_printk() conversion specifiers allowed: * %d %i %u %x %ld %li %lu %lx %lld %lli %llu %llx %p %pks %pus %s @@ -403,24 +425,8 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1, break; } - buf[0] = 0; - switch (fmt_ptype) { - case 's': -#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE - strncpy_from_unsafe(buf, unsafe_ptr, - sizeof(buf)); - break; -#endif - case 'k': - strncpy_from_kernel_nofault(buf, unsafe_ptr, - sizeof(buf)); - break; - case 'u': - strncpy_from_user_nofault(buf, - (__force void __user *)unsafe_ptr, - sizeof(buf)); - break; - } + bpf_trace_copy_string(buf, unsafe_ptr, fmt_ptype, + sizeof(buf)); goto fmt_next; }
Split out a helper to do the fault free access to the string pointer to get it out of a crazy indentation level. Signed-off-by: Christoph Hellwig <hch@lst.de> --- kernel/trace/bpf_trace.c | 42 +++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 18 deletions(-)