From nobody Tue Jun 16 01:36:36 2026 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B7F928CF5D; Wed, 15 Apr 2026 03:22:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776223356; cv=none; b=kL1AdxYWaNEuF3ANzjjxBRXVkKSEAmou9CIRJBPkJtspB8iwzTzOf529EltCBHfaekvuT5x+Xeeevb100ivxsvjqNhLaknwUlSk1HClGs0PotxkFoPBBAyj6flVz7ea9DCfZFYg8uwLqagB653aytuoq3U0DKFnNaB4/nYcj5Bg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776223356; c=relaxed/simple; bh=XBtFNZF0vzYnDBAemLLNAuSdSB5HXypPmUawhF0VY2w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=YBYKjWXT74J69cnttKvWoFL0tq/O0mCKTyKIYnoUC0tpqCnhx0A3I919ao0IoA2/K/7U1Tc7EAHFE5dI8/SENk/tHjGcSEf8IA1NjRkby8X8ZP/tW5IwnbmVTWBG1cTbrcZTf50I0o7t+wmsLoa/htwwvF6Y10fOhezdsf5yFLo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=HOeBnZ5/; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="HOeBnZ5/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1776223310; bh=PFYqnV7qM/6YAqub7pCrrliAUYG41gyQubmQPGVobFk=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=HOeBnZ5/zZLx1RHgaR/gBvqg0D5tk14lRZG6Q89OxdFLMUwdRqFOa/MPI4FKuQG/x lJ4gZa9/+KITgscYPAWdO138yrCJWZGq3BYHhi7zum4yacTC0cXUeK1Go519jMeTVt s6mkpuzgqjbj8LCevdXb/5lBhCclcWMYXCoQwSQ4= X-QQ-mid: zesmtpip4t1776223302ta285388f X-QQ-Originating-IP: RpSASEtGQvFEjJ1Fg6DA05FHi/8mF8/eAC2QI2zpL6E= Received: from localhost.localdomain ( [localhost]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 15 Apr 2026 11:21:41 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 2927168095533109201 EX-QQ-RecipientCnt: 10 From: Yihan Ding To: bpf@vger.kernel.org Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, shuah@kernel.org, linux-kernel@vger.kernel.org, paul.chaignon@gmail.com, alan.maguire@oracle.com, kernel@uniontech.com, Yihan Ding Subject: [PATCH bpf v2 1/2] bpf: allow UTF-8 literals in bpf_bprintf_prepare() Date: Wed, 15 Apr 2026 11:21:25 +0800 Message-Id: <20260415032126.1096299-2-dingyihan@uniontech.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260415032126.1096299-1-dingyihan@uniontech.com> References: <20260415032126.1096299-1-dingyihan@uniontech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpip:uniontech.com:qybglogicsvrsz:qybglogicsvrsz4b-0 X-QQ-XMAILINFO: MDMF6hDQSemcJTwScwwtWE43Utv8WOcJUKfVEXsEMMtMDXANeFEWd2qj Pq3LQPrz/OKoD3OTsvb5hsO/ZukWaphOssiLmUqgkeHcHEjOTmFDBCojD8CbcjkQXkwjPkZ Ygx57NQhcS1dIm4NhnNFTmGRAAHu0yUSTG7MIv94mbTR1bOaTeXVCYSPUig3Yjgu/p+zxor uQSBejv/I5Wh7a6TfCUAibd5fWYwxKMXuOXLye2goRUtAAsFlwEqksdqT8yOgXmMzslZ95s 6e/bfEDO3nqJJFNi7wTD8X8dp1M8PtgPnWZfxhwJ6JEMmNEAbOne5FHVH6/oiWpT97R3a7S hvuqfN2bLFNHcHUZEFpUBdx0ebo5qp8fi7xpr4pMZbv7P2jg/1R/cb1hCs5GN7zdOy/+b4M j9IfPrJ51d1fiviL1K/Z4Ip7VJsoV4wpbVImqo1ughmZUwTkxiRUrO7ntoz6q0eyWNjZ/Cn Uycmfx4pCAibQH3GgwSe9Ph4Rf8HmZo3ZQ5YV9TMcAH9E6sp7jIhGaEl8h9nAQmcW1n8DGp 37llVdG0UhH0wa9dHSVvETjJYZvoNHC2oZv/uMFLnYI43U0fZtgJKfImGzc+7NgErPdcch/ 7v/zcUqaiTn9Il4HL3C8LiI1jvyfu781RePZywzq9l3mScEJdR4X01L0oIUoYcyd5+Hcrmq kQYhJUndTVpaGZB1fVNk5ISWjcMhIRRP6E0gMQZGq1OJnfHakZbDOqmxMaebfqcG0eO7WKK 1SiPGQyWM8K9hAYvDUWTOt5I7BF7MZmeFa6DhI14bFbu1vcBaYgSn7QQEu8zIwi2UnPLZ7U Zy+Q2Z8hn30Ub3/8ABduG+89frny8L/qgeweIy/ibHtpU262SpbkdMnlSWKqMXC29B3N4Rv VDDyJd4pU1gloNqu/+94BbdzEEn/5oaTaHDBfRqhQEamtskoc0IwcyBVq0jZP3ju3lB5Ye0 ekWc31W5WfY+dVjjmERADaJWv/6WKUD4wZvAnb7OAYhuXbi6ST30PnUvW6HSTy92KpcxkXo eOx77QxTeLbytFnIsZ0yVI38i1iv0= X-QQ-XMRINFO: M/715EihBoGS47X28/vv4NpnfpeBLnr4Qg== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" bpf_bprintf_prepare() only needs ASCII parsing for conversion specifiers. Plain text can safely carry bytes >=3D 0x80, so allow UTF-8 literals outside '%' sequences while keeping ASCII control bytes rejected and format specifiers ASCII-only. This keeps existing parsing rules for format directives unchanged, while allowing helpers such as bpf_trace_printk() to emit UTF-8 literal text. Fixes: 48cac3f4a96d ("bpf: Implement formatted output helpers with bstr_pri= ntf") Suggested-by: Paul Chaignon Signed-off-by: Yihan Ding Acked-by: Paul Chaignon --- kernel/bpf/helpers.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 6eb6c82ed2ee..6319b39c92f9 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -845,7 +845,13 @@ int bpf_bprintf_prepare(const char *fmt, u32 fmt_size,= const u64 *raw_args, data->buf =3D buffers->buf; =20 for (i =3D 0; i < fmt_size; i++) { - if ((!isprint(fmt[i]) && !isspace(fmt[i])) || !isascii(fmt[i])) { + unsigned char c =3D fmt[i]; + + /* + * Permit bytes >=3D 0x80 in plain text so UTF-8 literals can pass + * through unchanged, while still rejecting ASCII control bytes. + */ + if (isascii(c) && !isprint(c) && !isspace(c)) { err =3D -EINVAL; goto out; } @@ -867,6 +873,14 @@ int bpf_bprintf_prepare(const char *fmt, u32 fmt_size,= const u64 *raw_args, * always access fmt[i + 1], in the worst case it will be a 0 */ i++; + /* + * The format parser below only understands ASCII conversion + * specifiers and modifiers, so reject non-ASCII after '%'. + */ + if (!isascii((unsigned char)fmt[i])) { + err =3D -EINVAL; + goto out; + } =20 /* skip optional "[0 +-][num]" width formatting field */ while (fmt[i] =3D=3D '0' || fmt[i] =3D=3D '+' || fmt[i] =3D=3D '-' || --=20 2.20.1 From nobody Tue Jun 16 01:36:36 2026 Received: from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B65BC28CF5D; Wed, 15 Apr 2026 03:22:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.207.19.206 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776223368; cv=none; b=CU+PZWdgXaxRqM3IIXB/8IORX5hDINUWya4yaQjU01izPkWTzyoJanAzC0RCiDLvZ9YEWlSH0RenhxEjZ3ZN+AaiDi/vQe96uLNlhy8x7/fo8FhIP+nMq76ebXZKUy3QDgtred31t6aEwbCxUQI5pLx07DZEyQAgPHsoRFG2oaM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776223368; c=relaxed/simple; bh=NiDDBj1otxDIg7G7cOdLRt29IfQDbiNx9uadV42in8k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=kHZT5jKgkW+R/OFdQTOBOVveqQQFXQBHanjCFTQAqXMbPtHcOJJ8kJ8kuaGDAFMmH5uFZZxADLHczBNIPVzBsDFmMSq+e3ZjPv9WOjpCItk+gMlM8BjhaTHzNohSzRWuLHkcGAPsAgoj+hG1pL7eMSNReEUwZnEgzcLLoY9RxNo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=p3dmB2iJ; arc=none smtp.client-ip=54.207.19.206 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="p3dmB2iJ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1776223313; bh=lCZAk/cEgPCjy6Qt2SDdMkiO9Vf4UdSkRwIqWJXf5aU=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=p3dmB2iJ2FnJx9EL2bzdOcSQ9yiyMJFeTD76p25mlAPDQ8SivqB9u9g6mo2poYW3B yubbKvmgEUl8N8wLo48e4UGSXncw7qqKK5IEpcl/hTN8UUHu3r7xitnuMEjDj+bBV9 LpPwNWEy879Y3Yz5PhVyb0Lv3oeFXY1o5auLKMh0= X-QQ-mid: zesmtpip4t1776223306t06ee2289 X-QQ-Originating-IP: 89XciiglrPtiScbt+uAiWtPXobvh9wdI+AB6AGNs05Q= Received: from localhost.localdomain ( [localhost]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 15 Apr 2026 11:21:45 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 11992392841904199774 EX-QQ-RecipientCnt: 10 From: Yihan Ding To: bpf@vger.kernel.org Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, shuah@kernel.org, linux-kernel@vger.kernel.org, paul.chaignon@gmail.com, alan.maguire@oracle.com, kernel@uniontech.com, Yihan Ding Subject: [PATCH bpf v2 2/2] selftests/bpf: cover UTF-8 trace_printk output Date: Wed, 15 Apr 2026 11:21:26 +0800 Message-Id: <20260415032126.1096299-3-dingyihan@uniontech.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260415032126.1096299-1-dingyihan@uniontech.com> References: <20260415032126.1096299-1-dingyihan@uniontech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpip:uniontech.com:qybglogicsvrsz:qybglogicsvrsz4b-0 X-QQ-XMAILINFO: MjQ00mYXMHtu0CPE2zsrVIjhUM/JyP3DGt+II1ATSCfvyNfAEjy4aHWk 8XyD9MJzC5fTwsytgteCuC9mVcF7mu/jlWddBWxzJArY4sDWTg4SmI4/9u78IKP7dbFlLUg 7YnW7UKdF5DusXq7DScfanmK8IxFHmdEndqXLWyAYSmhY9b1gQYJkMNvz5zRFEWw42GcoHO Fb6H0B0cQC+GqM2i2938RyiVf1IVJqojV95tnQZONrBy4vlDsP8DQCHF/cKBa4dEZ5+aSWV uNtQKFqff4/A8abZ1IUDtx/pgWDi3SnADc4WdlLu1JEga7JNA7F7JWYnmQ665kYjEENXg5H C4rapUvqnPrLcRvexfK8jsdUZ2PInTt5v1GNsn7UkKQ6/cT6UEZw0JD/KDQ00vIFzdZ5bFU s4I4brOh9sCz08lPmbNRTdMK2dqSlK3VhokUF7TaXTn902K5sbPvsEbrrWQwjbRf+aeUTgm Vjmggbwk8RB3rTsLqqkkb7ysJPEyLaFd3LjQzqA33s4XGnklEknah3HkbzxmtCrL27GZ/Qn Tv+5iRuuHIYZFxnpXgglfVJaySAD1AZt2G0xLtYVRzvWhAe41Lzq5ppQBcY5j/IP3YM73jM NRZBPrgIxr9MPOjSncbSUylDJD6XzURcq4fHzMqm9YGaTcV0wh+8e5EWqJ9pRqQ8KmWV6GF roaFtGDgTPDDSvsE31PekOqZp7Z0TvOR3S9r8mj2IAmhA1UrOhXCAk0lK5+GXZp25bExfMQ VWSSkI2DdAk/eZzXyxVR4nN1fIrGY8ZBY6eXt/IXYcgKGDiqsK1jsiVp9QY/RJx8OXS96T5 gZScxnH0sOVFn3L0d4E6BG5VOgE6QGVMGlCU12YBTWrRTdbU06CwX0i0OS0SWG5KxzqrPHf yztsBJiiTyA/wBOjOiqN5hXxHgFpF8nKg+eaBjQCNwag3KCjni6mt4KdJQCbLUv88x2ZM+G OpOsOXw8YtNt31Ed3OQECU6V+aygbqxvZYM9bMNVHe/HbztSSCVLSwaKD9pNgseSAwAWDmn dxyZmsWBqrRF8n1Q0kE7XrbLIZvxolgHmsfTxilQ== X-QQ-XMRINFO: NI4Ajvh11aEjEMj13RCX7UuhPEoou2bs1g== X-QQ-RECHKSPAM: 0 Extend trace_printk coverage to verify that UTF-8 literal text is emitted successfully and that non-ASCII bytes are still rejected once parsing is inside a '%' format sequence. Suggested-by: Alan Maguire Signed-off-by: Yihan Ding --- .../selftests/bpf/prog_tests/trace_printk.c | 26 +++++++++++++++---- .../selftests/bpf/progs/trace_printk.c | 9 +++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/trace_printk.c b/tools/= testing/selftests/bpf/prog_tests/trace_printk.c index e56e88596d64..40499f01d228 100644 --- a/tools/testing/selftests/bpf/prog_tests/trace_printk.c +++ b/tools/testing/selftests/bpf/prog_tests/trace_printk.c @@ -6,18 +6,21 @@ #include "trace_printk.lskel.h" =20 #define SEARCHMSG "testing,testing" +#define SEARCHMSG_UTF8 "=E4=B8=AD=E6=96=87,=E6=B5=8B=E8=AF=95" =20 static void trace_pipe_cb(const char *str, void *data) { if (strstr(str, SEARCHMSG) !=3D NULL) - (*(int *)data)++; + ((int *)data)[0]++; + if (strstr(str, SEARCHMSG_UTF8) !=3D NULL) + ((int *)data)[1]++; } =20 void serial_test_trace_printk(void) { struct trace_printk_lskel__bss *bss; struct trace_printk_lskel *skel; - int err =3D 0, found =3D 0; + int err =3D 0, found[2] =3D {}; =20 skel =3D 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; =20 - /* verify our search string is in the trace buffer */ - ASSERT_OK(read_trace_pipe_iter(trace_pipe_cb, &found, 1000), + 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_utf8_spec_ret, 0, + "bss->trace_printk_utf8_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"); =20 - if (!ASSERT_EQ(found, bss->trace_printk_ran, "found")) + if (!ASSERT_EQ(found[0], bss->trace_printk_ran, "found")) + goto cleanup; + + if (!ASSERT_EQ(found[1], bss->trace_printk_utf8_ran, "found_utf8")) goto cleanup; =20 cleanup: diff --git a/tools/testing/selftests/bpf/progs/trace_printk.c b/tools/testi= ng/selftests/bpf/progs/trace_printk.c index 6695478c2b25..62153d8c5eba 100644 --- a/tools/testing/selftests/bpf/progs/trace_printk.c +++ b/tools/testing/selftests/bpf/progs/trace_printk.c @@ -10,13 +10,22 @@ char _license[] SEC("license") =3D "GPL"; =20 int trace_printk_ret =3D 0; int trace_printk_ran =3D 0; +int trace_printk_utf8_spec_ret =3D 0; +int trace_printk_utf8_ret =3D 0; +int trace_printk_utf8_ran =3D 0; =20 const char fmt[] =3D "Testing,testing %d\n"; +static const char utf8_fmt[] =3D "=E4=B8=AD=E6=96=87,=E6=B5=8B=E8=AF=95 %d= \n"; +static const char utf8_spec_fmt[] =3D "%=E4=B8=AD=E6=96=87\n"; =20 SEC("fentry/" SYS_PREFIX "sys_nanosleep") int sys_enter(void *ctx) { trace_printk_ret =3D bpf_trace_printk(fmt, sizeof(fmt), ++trace_printk_ran); + trace_printk_utf8_ret =3D bpf_trace_printk(utf8_fmt, sizeof(utf8_fmt), + ++trace_printk_utf8_ran); + trace_printk_utf8_spec_ret =3D bpf_trace_printk(utf8_spec_fmt, + sizeof(utf8_spec_fmt)); return 0; } --=20 2.20.1