On Wed, Aug 11, 2021 at 7:15 PM Kuniyuki Iwashima <kuniyu@xxxxxxxxxxxx> wrote: > > From: Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> > Date: Wed, 11 Aug 2021 14:15:50 -0700 > > On Tue, Aug 10, 2021 at 2:29 AM Kuniyuki Iwashima <kuniyu@xxxxxxxxxxxx> wrote: > > > > > > /proc/net/unix uses "%c" to print a single-byte character to escape '\0' in > > > the name of the abstract UNIX domain socket. The following selftest uses > > > it, so this patch adds support for "%c". Note that it does not support > > > wide character ("%lc" and "%llc") for simplicity. > > > > > > Signed-off-by: Kuniyuki Iwashima <kuniyu@xxxxxxxxxxxx> > > > --- > > > kernel/bpf/helpers.c | 14 ++++++++++++++ > > > 1 file changed, 14 insertions(+) > > > > > > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > > > index 15746f779fe1..6d3aaf94e9ac 100644 > > > --- a/kernel/bpf/helpers.c > > > +++ b/kernel/bpf/helpers.c > > > @@ -907,6 +907,20 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args, > > > tmp_buf += err; > > > num_spec++; > > > > > > + continue; > > > + } else if (fmt[i] == 'c') { > > > > you are adding new features to printk-like helpers, please add > > corresponding tests as well. I'm particularly curious how something > > like "% 9c" (which is now allowed, along with a few other unusual > > combinations) will work. > > I see. I'll add a test. > I'm now thinking of test like: > 1. pin the bpf prog that outputs "% 9c" and other format strings. > 2. read and validate it Simpler. Use bpf_snprintf() to test all this logic. bpf_trace_printk(), bpf_snprintf() and bpf_seq_printf() share the same "backend" in kernel. No need to use bpf_iter program for testing this. Look for other snprintf() tests and just extend them. > > Is there any related test ? > and is there other complicated fomat strings to test ? > > Also, "% 9c" worked as is :) > > ---8<--- > $ sudo ./tools/bpftool/bpftool iter pin ./bpf_iter_unix.o /sys/fs/bpf/unix > $ sudo cat /sys/fs/bpf/unix | head -n 1 > a > $ git diff > diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_unix.c b/tools/testing/selftests/bpf/progs/bpf_iter_unix.c > index ad397e2962cf..8a7d5aa4c054 100644 > --- a/tools/testing/selftests/bpf/progs/bpf_iter_unix.c > +++ b/tools/testing/selftests/bpf/progs/bpf_iter_unix.c > @@ -34,8 +34,10 @@ int dump_unix(struct bpf_iter__unix *ctx) > > seq = ctx->meta->seq; > seq_num = ctx->meta->seq_num; > - if (seq_num == 0) > + if (seq_num == 0) { > + BPF_SEQ_PRINTF(seq, "% 9c\n", 'a'); > BPF_SEQ_PRINTF(seq, "Num RefCount Protocol Flags Type St Inode Path\n"); > + } > > BPF_SEQ_PRINTF(seq, "%pK: %08X %08X %08X %04X %02X %8lu", > unix_sk, > ---8<--- > > > > > > > > + if (!tmp_buf) > > > + goto nocopy_fmt; > > > + > > > + if (tmp_buf_end == tmp_buf) { > > > + err = -ENOSPC; > > > + goto out; > > > + } > > > + > > > + *tmp_buf = raw_args[num_spec]; > > > + tmp_buf++; > > > + num_spec++; > > > + > > > continue; > > > } > > > > > > -- > > > 2.30.2