From: Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> Date: Wed, 11 Aug 2021 21:24:31 -0700 > 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. I'll extend prog_tests/snprintf.c. Thank you! > > > > > 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