All of lore.kernel.org
 help / color / mirror / Atom feed
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
To: Breno Leitao <leitao@debian.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	linux-kernel@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Subject: [GIT PULL] bootconfig: Fixes for v7.2-rc1
Date: Wed, 1 Jul 2026 22:01:13 +0900	[thread overview]
Message-ID: <20260701220113.30eece0afaeb5b7ee5721c45@kernel.org> (raw)

Hi Linus,

Bootconfig fixes for v7.2-rc1:

- bootconfig: Fix NULL-pointer arithmetic
  Fix undefined pointer arithmetic in xbc_snprint_cmdline() when probing
  the buffer length with NULL and size 0. Track the written length as a
  size_t instead to prevent build-time UBSan/FORTIFY_SOURCE failures.


Please pull the latest bootconfig-fixes-v7.2-rc1 tree, which can be found at:


  git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
bootconfig-fixes-v7.2-rc1

Tag SHA1: 1884488387bb2dfe529a494cb187a73b58125fb0
Head SHA1: dec4d8118c179b3d12bca7e609054c6011c4f2ce


Breno Leitao (1):
      bootconfig: fix NULL-pointer arithmetic in xbc_snprint_cmdline()

----
 lib/bootconfig.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)
---------------------------
commit dec4d8118c179b3d12bca7e609054c6011c4f2ce
Author: Breno Leitao <leitao@debian.org>
Date:   Fri Jun 26 05:50:10 2026 -0700

    bootconfig: fix NULL-pointer arithmetic in xbc_snprint_cmdline()
    
    xbc_snprint_cmdline() is meant to be called twice: first with
    buf=NULL, size=0 to probe the rendered length, then with a real
    buffer to fill it (the standard snprintf() two-pass pattern). The
    probe call makes the function compute "buf + size" (NULL + 0) and,
    on every iteration, advance "buf += ret" from that NULL base and
    pass the result back into snprintf().
    
    Pointer arithmetic on a NULL pointer is undefined behavior. It is
    harmless in the in-kernel callers today, but the follow-up patches
    run this same code in the userspace tools/bootconfig parser at kernel
    build time, where host UBSan / FORTIFY_SOURCE abort the build.
    
    Track a running written length (size_t) instead of mutating @buf, and
    only form "buf + len" when @buf is non-NULL. snprintf(NULL, 0, ...)
    is itself well defined and returns the would-be length, so the
    two-pass "probe then fill" usage returns identical byte counts.
    
    Link: https://lore.kernel.org/all/20260626-bootconfig_using_tools-v7-1-24ab72139c29@debian.org/
    
    Fixes: 51887d03aca1 ("bootconfig: init: Allow admin to use bootconfig for kernel command line")
    Cc: stable@vger.kernel.org
    Signed-off-by: Breno Leitao <leitao@debian.org>
    Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>

diff --git a/lib/bootconfig.c b/lib/bootconfig.c
index f445b7703fdd..2ed9ee3dc81c 100644
--- a/lib/bootconfig.c
+++ b/lib/bootconfig.c
@@ -427,10 +427,18 @@ static char xbc_namebuf[XBC_KEYLEN_MAX] __initdata;
 int __init xbc_snprint_cmdline(char *buf, size_t size, struct xbc_node *root)
 {
 	struct xbc_node *knode, *vnode;
-	char *end = buf + size;
 	const char *val, *q;
+	size_t len = 0;
 	int ret;
 
+	/*
+	 * Track the running written length rather than advancing @buf, so we
+	 * never form "buf + size" or "buf += ret" while @buf is NULL (the
+	 * size-probe call passes buf=NULL, size=0). NULL pointer arithmetic
+	 * is undefined behavior and trips host UBSan / FORTIFY_SOURCE when
+	 * this renderer runs at kernel build time. snprintf(NULL, 0, ...)
+	 * itself is well defined and returns the would-be length.
+	 */
 	xbc_node_for_each_key_value(root, knode, val) {
 		ret = xbc_node_compose_key_after(root, knode,
 					xbc_namebuf, XBC_KEYLEN_MAX);
@@ -439,10 +447,11 @@ int __init xbc_snprint_cmdline(char *buf, size_t size, struct xbc_node *root)
 
 		vnode = xbc_node_get_child(knode);
 		if (!vnode) {
-			ret = snprintf(buf, rest(buf, end), "%s ", xbc_namebuf);
+			ret = snprintf(buf ? buf + len : NULL, rest(len, size),
+				       "%s ", xbc_namebuf);
 			if (ret < 0)
 				return ret;
-			buf += ret;
+			len += ret;
 			continue;
 		}
 		xbc_array_for_each_value(vnode, val) {
@@ -452,15 +461,15 @@ int __init xbc_snprint_cmdline(char *buf, size_t size, struct xbc_node *root)
 			 * whitespace.
 			 */
 			q = strpbrk(val, " \t\r\n") ? "\"" : "";
-			ret = snprintf(buf, rest(buf, end), "%s=%s%s%s ",
-				       xbc_namebuf, q, val, q);
+			ret = snprintf(buf ? buf + len : NULL, rest(len, size),
+				       "%s=%s%s%s ", xbc_namebuf, q, val, q);
 			if (ret < 0)
 				return ret;
-			buf += ret;
+			len += ret;
 		}
 	}
 
-	return buf - (end - size);
+	return len;
 }
 #undef rest
 

-- 
Masami Hiramatsu (Google) <mhiramat@kernel.org>

             reply	other threads:[~2026-07-01 13:01 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-01 13:01 Masami Hiramatsu [this message]
2026-07-02  0:28 ` [GIT PULL] bootconfig: Fixes for v7.2-rc1 pr-tracker-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260701220113.30eece0afaeb5b7ee5721c45@kernel.org \
    --to=mhiramat@kernel.org \
    --cc=leitao@debian.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.