]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: cover UTF-8 trace_printk output
authorYihan Ding <dingyihan@uniontech.com>
Thu, 16 Apr 2026 12:01:42 +0000 (20:01 +0800)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 16 Apr 2026 22:53:32 +0000 (15:53 -0700)
Extend trace_printk coverage to verify that UTF-8 literal text is
emitted successfully and that '%' parsing still rejects non-ASCII
bytes once format parsing starts.

Use an explicitly invalid format string for the negative case so the
ASCII-only parser expectation is visible from the test code itself.

Signed-off-by: Yihan Ding <dingyihan@uniontech.com>
Acked-by: Paul Chaignon <paul.chaignon@gmail.com>
Link: https://lore.kernel.org/r/20260416120142.1420646-3-dingyihan@uniontech.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/trace_printk.c
tools/testing/selftests/bpf/progs/trace_printk.c

index e56e88596d6461b5c3f787b432ff5103cd51734e..a5a8104c1ddd749a1fe748b2e5efcac612062a6c 100644 (file)
@@ -6,18 +6,21 @@
 #include "trace_printk.lskel.h"
 
 #define SEARCHMSG      "testing,testing"
+#define SEARCHMSG_UTF8 "中文,测试"
 
 static void trace_pipe_cb(const char *str, void *data)
 {
        if (strstr(str, SEARCHMSG) != NULL)
-               (*(int *)data)++;
+               ((int *)data)[0]++;
+       if (strstr(str, SEARCHMSG_UTF8))
+               ((int *)data)[1]++;
 }
 
 void serial_test_trace_printk(void)
 {
        struct trace_printk_lskel__bss *bss;
        struct trace_printk_lskel *skel;
-       int err = 0, found = 0;
+       int err = 0, found[2] = {};
 
        skel = trace_printk_lskel__open();
        if (!ASSERT_OK_PTR(skel, "trace_printk__open"))
@@ -46,11 +49,24 @@ void serial_test_trace_printk(void)
        if (!ASSERT_GT(bss->trace_printk_ret, 0, "bss->trace_printk_ret"))
                goto cleanup;
 
-       /* verify our search string is in the trace buffer */
-       ASSERT_OK(read_trace_pipe_iter(trace_pipe_cb, &found, 1000),
-                "read_trace_pipe_iter");
+       if (!ASSERT_GT(bss->trace_printk_utf8_ran, 0, "bss->trace_printk_utf8_ran"))
+               goto cleanup;
+
+       if (!ASSERT_GT(bss->trace_printk_utf8_ret, 0, "bss->trace_printk_utf8_ret"))
+               goto cleanup;
+
+       if (!ASSERT_LT(bss->trace_printk_invalid_spec_ret, 0,
+                      "bss->trace_printk_invalid_spec_ret"))
+               goto cleanup;
+
+       /* verify our search strings are in the trace buffer */
+       ASSERT_OK(read_trace_pipe_iter(trace_pipe_cb, found, 1000),
+                 "read_trace_pipe_iter");
+
+       if (!ASSERT_EQ(found[0], bss->trace_printk_ran, "found"))
+               goto cleanup;
 
-       if (!ASSERT_EQ(found, bss->trace_printk_ran, "found"))
+       if (!ASSERT_EQ(found[1], bss->trace_printk_utf8_ran, "found_utf8"))
                goto cleanup;
 
 cleanup:
index 6695478c2b2501fbc490f827727070163931fbf1..f4c538ec3ebd1d5b009105f309a3a5768eb60cd7 100644 (file)
@@ -10,13 +10,23 @@ char _license[] SEC("license") = "GPL";
 
 int trace_printk_ret = 0;
 int trace_printk_ran = 0;
+int trace_printk_invalid_spec_ret = 0;
+int trace_printk_utf8_ret = 0;
+int trace_printk_utf8_ran = 0;
 
 const char fmt[] = "Testing,testing %d\n";
+static const char utf8_fmt[] = "中文,测试 %d\n";
+/* Non-ASCII bytes after '%' must still be rejected. */
+static const char invalid_spec_fmt[] = "%\x80\n";
 
 SEC("fentry/" SYS_PREFIX "sys_nanosleep")
 int sys_enter(void *ctx)
 {
        trace_printk_ret = bpf_trace_printk(fmt, sizeof(fmt),
                                            ++trace_printk_ran);
+       trace_printk_utf8_ret = bpf_trace_printk(utf8_fmt, sizeof(utf8_fmt),
+                                                ++trace_printk_utf8_ran);
+       trace_printk_invalid_spec_ret = bpf_trace_printk(invalid_spec_fmt,
+                                                        sizeof(invalid_spec_fmt));
        return 0;
 }