* [PATCH v3 1/6] initramfs_test: add fill_cpio() format parameter
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
@ 2026-03-23 14:54 ` Andy Shevchenko
2026-03-26 16:23 ` Petr Mladek
2026-03-23 14:54 ` [PATCH v3 2/6] initramfs_test: test header fields with 0x hex prefix Andy Shevchenko
` (6 subsequent siblings)
7 siblings, 1 reply; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-23 14:54 UTC (permalink / raw)
To: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel
Cc: Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky, Andrew Morton
From: David Disseldorp <ddiss@suse.de>
fill_cpio() uses sprintf() to write out the in-memory cpio archive from
an array of struct initramfs_test_cpio. This change allows callers to
override the cpio sprintf() format string so that future tests can
intentionally corrupt the header with non-hex values.
Signed-off-by: David Disseldorp <ddiss@suse.de>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
init/initramfs_test.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/init/initramfs_test.c b/init/initramfs_test.c
index 2ce38d9a8fd0..7b6ecab794c7 100644
--- a/init/initramfs_test.c
+++ b/init/initramfs_test.c
@@ -27,7 +27,10 @@ struct initramfs_test_cpio {
char *data;
};
-static size_t fill_cpio(struct initramfs_test_cpio *cs, size_t csz, char *out)
+#define CPIO_HDR_FMT "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%s"
+
+static size_t fill_cpio(struct initramfs_test_cpio *cs, size_t csz, char *fmt,
+ char *out)
{
int i;
size_t off = 0;
@@ -38,9 +41,7 @@ static size_t fill_cpio(struct initramfs_test_cpio *cs, size_t csz, char *out)
size_t thislen;
/* +1 to account for nulterm */
- thislen = sprintf(pos, "%s"
- "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x"
- "%s",
+ thislen = sprintf(pos, fmt,
c->magic, c->ino, c->mode, c->uid, c->gid, c->nlink,
c->mtime, c->filesize, c->devmajor, c->devminor,
c->rdevmajor, c->rdevminor, c->namesize, c->csum,
@@ -102,7 +103,7 @@ static void __init initramfs_test_extract(struct kunit *test)
/* +3 to cater for any 4-byte end-alignment */
cpio_srcbuf = kzalloc(ARRAY_SIZE(c) * (CPIO_HDRLEN + PATH_MAX + 3),
GFP_KERNEL);
- len = fill_cpio(c, ARRAY_SIZE(c), cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, cpio_srcbuf);
ktime_get_real_ts64(&ts_before);
err = unpack_to_rootfs(cpio_srcbuf, len);
@@ -177,7 +178,7 @@ static void __init initramfs_test_fname_overrun(struct kunit *test)
/* limit overrun to avoid crashes / filp_open() ENAMETOOLONG */
cpio_srcbuf[CPIO_HDRLEN + strlen(c[0].fname) + 20] = '\0';
- len = fill_cpio(c, ARRAY_SIZE(c), cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, cpio_srcbuf);
/* overwrite trailing fname terminator and padding */
suffix_off = len - 1;
while (cpio_srcbuf[suffix_off] == '\0') {
@@ -219,7 +220,7 @@ static void __init initramfs_test_data(struct kunit *test)
cpio_srcbuf = kmalloc(CPIO_HDRLEN + c[0].namesize + c[0].filesize + 6,
GFP_KERNEL);
- len = fill_cpio(c, ARRAY_SIZE(c), cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, cpio_srcbuf);
err = unpack_to_rootfs(cpio_srcbuf, len);
KUNIT_EXPECT_NULL(test, err);
@@ -274,7 +275,7 @@ static void __init initramfs_test_csum(struct kunit *test)
cpio_srcbuf = kmalloc(8192, GFP_KERNEL);
- len = fill_cpio(c, ARRAY_SIZE(c), cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, cpio_srcbuf);
err = unpack_to_rootfs(cpio_srcbuf, len);
KUNIT_EXPECT_NULL(test, err);
@@ -284,7 +285,7 @@ static void __init initramfs_test_csum(struct kunit *test)
/* mess up the csum and confirm that unpack fails */
c[0].csum--;
- len = fill_cpio(c, ARRAY_SIZE(c), cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, cpio_srcbuf);
err = unpack_to_rootfs(cpio_srcbuf, len);
KUNIT_EXPECT_NOT_NULL(test, err);
@@ -330,7 +331,7 @@ static void __init initramfs_test_hardlink(struct kunit *test)
cpio_srcbuf = kmalloc(8192, GFP_KERNEL);
- len = fill_cpio(c, ARRAY_SIZE(c), cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, cpio_srcbuf);
err = unpack_to_rootfs(cpio_srcbuf, len);
KUNIT_EXPECT_NULL(test, err);
@@ -371,7 +372,7 @@ static void __init initramfs_test_many(struct kunit *test)
};
c.namesize = 1 + sprintf(thispath, "initramfs_test_many-%d", i);
- p += fill_cpio(&c, 1, p);
+ p += fill_cpio(&c, 1, CPIO_HDR_FMT, p);
}
len = p - cpio_srcbuf;
@@ -425,7 +426,7 @@ static void __init initramfs_test_fname_pad(struct kunit *test)
} };
memcpy(tbufs->padded_fname, "padded_fname", sizeof("padded_fname"));
- len = fill_cpio(c, ARRAY_SIZE(c), tbufs->cpio_srcbuf);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, tbufs->cpio_srcbuf);
err = unpack_to_rootfs(tbufs->cpio_srcbuf, len);
KUNIT_EXPECT_NULL(test, err);
@@ -481,7 +482,7 @@ static void __init initramfs_test_fname_path_max(struct kunit *test)
memcpy(tbufs->fname_oversize, "fname_oversize",
sizeof("fname_oversize") - 1);
memcpy(tbufs->fname_ok, "fname_ok", sizeof("fname_ok") - 1);
- len = fill_cpio(c, ARRAY_SIZE(c), tbufs->cpio_src);
+ len = fill_cpio(c, ARRAY_SIZE(c), CPIO_HDR_FMT, tbufs->cpio_src);
/* unpack skips over fname_oversize instead of returning an error */
err = unpack_to_rootfs(tbufs->cpio_src, len);
--
2.50.1
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 1/6] initramfs_test: add fill_cpio() format parameter
2026-03-23 14:54 ` [PATCH v3 1/6] initramfs_test: add fill_cpio() format parameter Andy Shevchenko
@ 2026-03-26 16:23 ` Petr Mladek
2026-03-26 23:10 ` David Disseldorp
0 siblings, 1 reply; 18+ messages in thread
From: Petr Mladek @ 2026-03-26 16:23 UTC (permalink / raw)
To: Andy Shevchenko
Cc: David Disseldorp, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon 2026-03-23 15:54:17, Andy Shevchenko wrote:
> From: David Disseldorp <ddiss@suse.de>
>
> fill_cpio() uses sprintf() to write out the in-memory cpio archive from
> an array of struct initramfs_test_cpio. This change allows callers to
> override the cpio sprintf() format string so that future tests can
> intentionally corrupt the header with non-hex values.
>
> --- a/init/initramfs_test.c
> +++ b/init/initramfs_test.c
> @@ -27,7 +27,10 @@ struct initramfs_test_cpio {
> char *data;
> };
>
> -static size_t fill_cpio(struct initramfs_test_cpio *cs, size_t csz, char *out)
> +#define CPIO_HDR_FMT "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%s"
> +
> +static size_t fill_cpio(struct initramfs_test_cpio *cs, size_t csz, char *fmt,
> + char *out)
This should be "const char *fmt" as pointed out by
https://sashiko.dev/#/patchset/20260323150054.3587083-1-andriy.shevchenko%40linux.intel.com
> {
> int i;
> size_t off = 0;
> @@ -38,9 +41,7 @@ static size_t fill_cpio(struct initramfs_test_cpio *cs, size_t csz, char *out)
> size_t thislen;
>
> /* +1 to account for nulterm */
> - thislen = sprintf(pos, "%s"
> - "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x"
> - "%s",
> + thislen = sprintf(pos, fmt,
> c->magic, c->ino, c->mode, c->uid, c->gid, c->nlink,
> c->mtime, c->filesize, c->devmajor, c->devminor,
> c->rdevmajor, c->rdevminor, c->namesize, c->csum,
The compiler is not longer able to check whether the number/type of
parameters match the given printf format. It was poitned out by
Sashiko.dev AI and I agree that it makes it harder to maintain.
A solution might be to split this sprintf out into a macro.
Or add some "bool inject_ox" parameter and keep the format
hardcoded here.
I did not found any other problems ;-)
Best Regards,
Petr
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v3 1/6] initramfs_test: add fill_cpio() format parameter
2026-03-26 16:23 ` Petr Mladek
@ 2026-03-26 23:10 ` David Disseldorp
0 siblings, 0 replies; 18+ messages in thread
From: David Disseldorp @ 2026-03-26 23:10 UTC (permalink / raw)
To: Petr Mladek
Cc: Andy Shevchenko, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
Thanks for the feedback Petr...
On Thu, 26 Mar 2026 17:23:11 +0100, Petr Mladek wrote:
> The compiler is not longer able to check whether the number/type of
> parameters match the given printf format. It was poitned out by
> Sashiko.dev AI and I agree that it makes it harder to maintain.
>
> A solution might be to split this sprintf out into a macro.
> Or add some "bool inject_ox" parameter and keep the format
> hardcoded here.
The "bool inject_ox" option would keep the test code relatively simple.
I'll do that and send a v4.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 2/6] initramfs_test: test header fields with 0x hex prefix
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
2026-03-23 14:54 ` [PATCH v3 1/6] initramfs_test: add fill_cpio() format parameter Andy Shevchenko
@ 2026-03-23 14:54 ` Andy Shevchenko
2026-03-23 14:54 ` [PATCH v3 3/6] initramfs: Sort headers alphabetically Andy Shevchenko
` (5 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-23 14:54 UTC (permalink / raw)
To: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel
Cc: Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky, Andrew Morton
From: David Disseldorp <ddiss@suse.de>
cpio header fields are 8-byte hex strings, but one "interesting"
side-effect of our historic simple_str[n]toul() use means that a "0x"
(or "0X") prefixed header field will be successfully processed when
coupled alongside a 6-byte hex remainder string.
"0x" prefix support is contrary to the initramfs specification at
Documentation/driver-api/early-userspace/buffer-format.rst which states:
The structure of the cpio_header is as follows (all fields contain
hexadecimal ASCII numbers fully padded with '0' on the left to the
full width of the field, for example, the integer 4780 is represented
by the ASCII string "000012ac"):
Test for this corner case by injecting "0x" prefixes into the uid, gid
and namesize cpio header fields. Confirm that init_stat() returns
matching uid and gid values.
This test can be modified in future to expect unpack_to_rootfs() failure
when header validation is changed to properly follow the specification.
Signed-off-by: David Disseldorp <ddiss@suse.de>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
init/initramfs_test.c | 60 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/init/initramfs_test.c b/init/initramfs_test.c
index 7b6ecab794c7..4d9a4075476c 100644
--- a/init/initramfs_test.c
+++ b/init/initramfs_test.c
@@ -495,6 +495,65 @@ static void __init initramfs_test_fname_path_max(struct kunit *test)
kfree(tbufs);
}
+static void __init initramfs_test_hdr_hex(struct kunit *test)
+{
+ char *err, *fmt;
+ size_t len;
+ struct kstat st0, st1;
+ char fdata[] = "this file data will be unpacked";
+ struct initramfs_test_bufs {
+ char cpio_src[(CPIO_HDRLEN + PATH_MAX + 3 + sizeof(fdata)) * 2];
+ } *tbufs = kzalloc(sizeof(struct initramfs_test_bufs), GFP_KERNEL);
+ struct initramfs_test_cpio c[] = { {
+ .magic = "070701",
+ .ino = 1,
+ .mode = S_IFREG | 0777,
+ .uid = 0x123456,
+ .gid = 0x123457,
+ .nlink = 1,
+ .namesize = sizeof("initramfs_test_hdr_hex_0"),
+ .fname = "initramfs_test_hdr_hex_0",
+ .filesize = sizeof(fdata),
+ .data = fdata,
+ }, {
+ .magic = "070701",
+ .ino = 2,
+ .mode = S_IFDIR | 0777,
+ .uid = 0x000056,
+ .gid = 0x000057,
+ .nlink = 1,
+ .namesize = sizeof("initramfs_test_hdr_hex_1"),
+ .fname = "initramfs_test_hdr_hex_1",
+ } };
+ /*
+ * override CPIO_HDR_FMT and instead use a format string which places
+ * "0x" prefixes on the uid, gid and namesize values.
+ * parse_header()/simple_str[n]toul() accept this.
+ */
+ fmt = "%s%08x%08x0x%06x0X%06x%08x%08x%08x%08x%08x%08x%08x0x%06x%08x%s";
+ len = fill_cpio(c, ARRAY_SIZE(c), fmt, tbufs->cpio_src);
+
+ err = unpack_to_rootfs(tbufs->cpio_src, len);
+ KUNIT_EXPECT_NULL(test, err);
+
+ KUNIT_EXPECT_EQ(test, init_stat(c[0].fname, &st0, 0), 0);
+ KUNIT_EXPECT_EQ(test, init_stat(c[1].fname, &st1, 0), 0);
+
+ KUNIT_EXPECT_TRUE(test,
+ uid_eq(st0.uid, make_kuid(current_user_ns(), (uid_t)0x123456)));
+ KUNIT_EXPECT_TRUE(test,
+ gid_eq(st0.gid, make_kgid(current_user_ns(), (gid_t)0x123457)));
+ KUNIT_EXPECT_TRUE(test,
+ uid_eq(st1.uid, make_kuid(current_user_ns(), (uid_t)0x56)));
+ KUNIT_EXPECT_TRUE(test,
+ gid_eq(st1.gid, make_kgid(current_user_ns(), (gid_t)0x57)));
+
+ KUNIT_EXPECT_EQ(test, init_unlink(c[0].fname), 0);
+ KUNIT_EXPECT_EQ(test, init_rmdir(c[1].fname), 0);
+
+ kfree(tbufs);
+}
+
/*
* The kunit_case/_suite struct cannot be marked as __initdata as this will be
* used in debugfs to retrieve results after test has run.
@@ -508,6 +567,7 @@ static struct kunit_case __refdata initramfs_test_cases[] = {
KUNIT_CASE(initramfs_test_many),
KUNIT_CASE(initramfs_test_fname_pad),
KUNIT_CASE(initramfs_test_fname_path_max),
+ KUNIT_CASE(initramfs_test_hdr_hex),
{},
};
--
2.50.1
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v3 3/6] initramfs: Sort headers alphabetically
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
2026-03-23 14:54 ` [PATCH v3 1/6] initramfs_test: add fill_cpio() format parameter Andy Shevchenko
2026-03-23 14:54 ` [PATCH v3 2/6] initramfs_test: test header fields with 0x hex prefix Andy Shevchenko
@ 2026-03-23 14:54 ` Andy Shevchenko
2026-03-23 22:38 ` David Disseldorp
2026-03-23 14:54 ` [PATCH v3 4/6] initramfs: Refactor to use hex2bin() instead of custom approach Andy Shevchenko
` (4 subsequent siblings)
7 siblings, 1 reply; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-23 14:54 UTC (permalink / raw)
To: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel
Cc: Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky, Andrew Morton
Sorting headers alphabetically helps locating duplicates, and makes it
easier to figure out where to insert new headers.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
init/initramfs.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/init/initramfs.c b/init/initramfs.c
index 139baed06589..4ed796566cf3 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -1,25 +1,25 @@
// SPDX-License-Identifier: GPL-2.0
-#include <linux/init.h>
#include <linux/async.h>
-#include <linux/export.h>
-#include <linux/fs.h>
-#include <linux/slab.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
#include <linux/delay.h>
-#include <linux/string.h>
#include <linux/dirent.h>
-#include <linux/syscalls.h>
-#include <linux/utime.h>
+#include <linux/export.h>
+#include <linux/fcntl.h>
#include <linux/file.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/init_syscalls.h>
#include <linux/kstrtox.h>
#include <linux/memblock.h>
#include <linux/mm.h>
#include <linux/namei.h>
-#include <linux/init_syscalls.h>
-#include <linux/umh.h>
-#include <linux/security.h>
#include <linux/overflow.h>
+#include <linux/security.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/syscalls.h>
+#include <linux/types.h>
+#include <linux/umh.h>
+#include <linux/utime.h>
#include "do_mounts.h"
#include "initramfs_internal.h"
--
2.50.1
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 3/6] initramfs: Sort headers alphabetically
2026-03-23 14:54 ` [PATCH v3 3/6] initramfs: Sort headers alphabetically Andy Shevchenko
@ 2026-03-23 22:38 ` David Disseldorp
0 siblings, 0 replies; 18+ messages in thread
From: David Disseldorp @ 2026-03-23 22:38 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Petr Mladek, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon, 23 Mar 2026 15:54:19 +0100, Andy Shevchenko wrote:
> Sorting headers alphabetically helps locating duplicates, and makes it
> easier to figure out where to insert new headers.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: David Disseldorp <ddiss@suse.de>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 4/6] initramfs: Refactor to use hex2bin() instead of custom approach
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
` (2 preceding siblings ...)
2026-03-23 14:54 ` [PATCH v3 3/6] initramfs: Sort headers alphabetically Andy Shevchenko
@ 2026-03-23 14:54 ` Andy Shevchenko
2026-03-23 14:54 ` [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul" Andy Shevchenko
` (3 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-23 14:54 UTC (permalink / raw)
To: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel
Cc: Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky, Andrew Morton
There is a simple_strntoul() function used solely as a shortcut
for hex2bin() with proper endianess conversions. Replace that
and drop the unneeded function in the next changes.
This implementation will abort if we fail to parse the cpio header,
instead of using potentially bogus header values.
Co-developed-by: David Disseldorp <ddiss@suse.de>
Signed-off-by: David Disseldorp <ddiss@suse.de>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
init/initramfs.c | 44 +++++++++++++++++++++++++------------------
init/initramfs_test.c | 23 ++++------------------
2 files changed, 30 insertions(+), 37 deletions(-)
diff --git a/init/initramfs.c b/init/initramfs.c
index 4ed796566cf3..0d38ea8e63a2 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -6,6 +6,7 @@
#include <linux/fcntl.h>
#include <linux/file.h>
#include <linux/fs.h>
+#include <linux/hex.h>
#include <linux/init.h>
#include <linux/init_syscalls.h>
#include <linux/kstrtox.h>
@@ -21,6 +22,8 @@
#include <linux/umh.h>
#include <linux/utime.h>
+#include <asm/byteorder.h>
+
#include "do_mounts.h"
#include "initramfs_internal.h"
@@ -190,26 +193,30 @@ static __initdata gid_t gid;
static __initdata unsigned rdev;
static __initdata u32 hdr_csum;
-static void __init parse_header(char *s)
+static int __init parse_header(char *s)
{
- unsigned long parsed[13];
- int i;
+ __be32 header[13];
+ int ret;
- for (i = 0, s += 6; i < 13; i++, s += 8)
- parsed[i] = simple_strntoul(s, NULL, 16, 8);
+ ret = hex2bin((u8 *)header, s + 6, sizeof(header));
+ if (ret) {
+ error("damaged header");
+ return ret;
+ }
- ino = parsed[0];
- mode = parsed[1];
- uid = parsed[2];
- gid = parsed[3];
- nlink = parsed[4];
- mtime = parsed[5]; /* breaks in y2106 */
- body_len = parsed[6];
- major = parsed[7];
- minor = parsed[8];
- rdev = new_encode_dev(MKDEV(parsed[9], parsed[10]));
- name_len = parsed[11];
- hdr_csum = parsed[12];
+ ino = be32_to_cpu(header[0]);
+ mode = be32_to_cpu(header[1]);
+ uid = be32_to_cpu(header[2]);
+ gid = be32_to_cpu(header[3]);
+ nlink = be32_to_cpu(header[4]);
+ mtime = be32_to_cpu(header[5]); /* breaks in y2106 */
+ body_len = be32_to_cpu(header[6]);
+ major = be32_to_cpu(header[7]);
+ minor = be32_to_cpu(header[8]);
+ rdev = new_encode_dev(MKDEV(be32_to_cpu(header[9]), be32_to_cpu(header[10])));
+ name_len = be32_to_cpu(header[11]);
+ hdr_csum = be32_to_cpu(header[12]);
+ return 0;
}
/* FSM */
@@ -289,7 +296,8 @@ static int __init do_header(void)
error("no cpio magic");
return 1;
}
- parse_header(collected);
+ if (parse_header(collected))
+ return 1;
next_header = this_header + N_ALIGN(name_len) + body_len;
next_header = (next_header + 3) & ~3;
state = SkipIt;
diff --git a/init/initramfs_test.c b/init/initramfs_test.c
index 4d9a4075476c..df484f9d9c1b 100644
--- a/init/initramfs_test.c
+++ b/init/initramfs_test.c
@@ -499,8 +499,7 @@ static void __init initramfs_test_hdr_hex(struct kunit *test)
{
char *err, *fmt;
size_t len;
- struct kstat st0, st1;
- char fdata[] = "this file data will be unpacked";
+ char fdata[] = "this file data will not be unpacked";
struct initramfs_test_bufs {
char cpio_src[(CPIO_HDRLEN + PATH_MAX + 3 + sizeof(fdata)) * 2];
} *tbufs = kzalloc(sizeof(struct initramfs_test_bufs), GFP_KERNEL);
@@ -528,28 +527,14 @@ static void __init initramfs_test_hdr_hex(struct kunit *test)
/*
* override CPIO_HDR_FMT and instead use a format string which places
* "0x" prefixes on the uid, gid and namesize values.
- * parse_header()/simple_str[n]toul() accept this.
+ * parse_header()/simple_str[n]toul() accepted this, contrary to the
+ * initramfs specification. hex2bin() now fails.
*/
fmt = "%s%08x%08x0x%06x0X%06x%08x%08x%08x%08x%08x%08x%08x0x%06x%08x%s";
len = fill_cpio(c, ARRAY_SIZE(c), fmt, tbufs->cpio_src);
err = unpack_to_rootfs(tbufs->cpio_src, len);
- KUNIT_EXPECT_NULL(test, err);
-
- KUNIT_EXPECT_EQ(test, init_stat(c[0].fname, &st0, 0), 0);
- KUNIT_EXPECT_EQ(test, init_stat(c[1].fname, &st1, 0), 0);
-
- KUNIT_EXPECT_TRUE(test,
- uid_eq(st0.uid, make_kuid(current_user_ns(), (uid_t)0x123456)));
- KUNIT_EXPECT_TRUE(test,
- gid_eq(st0.gid, make_kgid(current_user_ns(), (gid_t)0x123457)));
- KUNIT_EXPECT_TRUE(test,
- uid_eq(st1.uid, make_kuid(current_user_ns(), (uid_t)0x56)));
- KUNIT_EXPECT_TRUE(test,
- gid_eq(st1.gid, make_kgid(current_user_ns(), (gid_t)0x57)));
-
- KUNIT_EXPECT_EQ(test, init_unlink(c[0].fname), 0);
- KUNIT_EXPECT_EQ(test, init_rmdir(c[1].fname), 0);
+ KUNIT_EXPECT_NOT_NULL(test, err);
kfree(tbufs);
}
--
2.50.1
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul"
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
` (3 preceding siblings ...)
2026-03-23 14:54 ` [PATCH v3 4/6] initramfs: Refactor to use hex2bin() instead of custom approach Andy Shevchenko
@ 2026-03-23 14:54 ` Andy Shevchenko
2026-03-23 22:38 ` David Disseldorp
2026-03-26 16:32 ` Petr Mladek
2026-03-23 14:54 ` [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations Andy Shevchenko
` (2 subsequent siblings)
7 siblings, 2 replies; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-23 14:54 UTC (permalink / raw)
To: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel
Cc: Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky, Andrew Morton
No users anymore and none should be in the first place.
This reverts commit fcc155008a20fa31b01569e105250490750f0687.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
include/linux/kstrtox.h | 1 -
lib/vsprintf.c | 7 -------
2 files changed, 8 deletions(-)
diff --git a/include/linux/kstrtox.h b/include/linux/kstrtox.h
index 6ea897222af1..7fcf29a4e0de 100644
--- a/include/linux/kstrtox.h
+++ b/include/linux/kstrtox.h
@@ -143,7 +143,6 @@ static inline int __must_check kstrtos32_from_user(const char __user *s, size_t
*/
extern unsigned long simple_strtoul(const char *,char **,unsigned int);
-extern unsigned long simple_strntoul(const char *,char **,unsigned int,size_t);
extern long simple_strtol(const char *,char **,unsigned int);
extern unsigned long long simple_strtoull(const char *,char **,unsigned int);
extern long long simple_strtoll(const char *,char **,unsigned int);
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 800b8ac49f53..52ea14a08d3a 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -129,13 +129,6 @@ unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
}
EXPORT_SYMBOL(simple_strtoul);
-unsigned long simple_strntoul(const char *cp, char **endp, unsigned int base,
- size_t max_chars)
-{
- return simple_strntoull(cp, endp, base, max_chars);
-}
-EXPORT_SYMBOL(simple_strntoul);
-
/**
* simple_strtol - convert a string to a signed long
* @cp: The start of the string
--
2.50.1
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul"
2026-03-23 14:54 ` [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul" Andy Shevchenko
@ 2026-03-23 22:38 ` David Disseldorp
2026-03-26 16:32 ` Petr Mladek
1 sibling, 0 replies; 18+ messages in thread
From: David Disseldorp @ 2026-03-23 22:38 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Petr Mladek, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon, 23 Mar 2026 15:54:21 +0100, Andy Shevchenko wrote:
> No users anymore and none should be in the first place.
>
> This reverts commit fcc155008a20fa31b01569e105250490750f0687.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: David Disseldorp <ddiss@suse.de>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul"
2026-03-23 14:54 ` [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul" Andy Shevchenko
2026-03-23 22:38 ` David Disseldorp
@ 2026-03-26 16:32 ` Petr Mladek
1 sibling, 0 replies; 18+ messages in thread
From: Petr Mladek @ 2026-03-26 16:32 UTC (permalink / raw)
To: Andy Shevchenko
Cc: David Disseldorp, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon 2026-03-23 15:54:21, Andy Shevchenko wrote:
> No users anymore and none should be in the first place.
>
> This reverts commit fcc155008a20fa31b01569e105250490750f0687.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Petr Mladek <pmladek@suse.com>
Best Regards,
Petr
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
` (4 preceding siblings ...)
2026-03-23 14:54 ` [PATCH v3 5/6] vsprintf: Revert "add simple_strntoul" Andy Shevchenko
@ 2026-03-23 14:54 ` Andy Shevchenko
2026-03-23 22:38 ` David Disseldorp
2026-03-26 16:33 ` Petr Mladek
2026-03-23 22:07 ` [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andrew Morton
2026-03-26 16:39 ` Petr Mladek
7 siblings, 2 replies; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-23 14:54 UTC (permalink / raw)
To: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel
Cc: Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky, Andrew Morton
There is legacy 'extern' keyword for the exported simple_strtox()
function which are the artefact that can be removed. So drop it.
While at it, tweak the declaration to provide parameter names.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
include/linux/kstrtox.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/linux/kstrtox.h b/include/linux/kstrtox.h
index 7fcf29a4e0de..6c9282866770 100644
--- a/include/linux/kstrtox.h
+++ b/include/linux/kstrtox.h
@@ -142,9 +142,9 @@ static inline int __must_check kstrtos32_from_user(const char __user *s, size_t
* Keep in mind above caveat.
*/
-extern unsigned long simple_strtoul(const char *,char **,unsigned int);
-extern long simple_strtol(const char *,char **,unsigned int);
-extern unsigned long long simple_strtoull(const char *,char **,unsigned int);
-extern long long simple_strtoll(const char *,char **,unsigned int);
+unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base);
+long simple_strtol(const char *cp, char **endp, unsigned int base);
+unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base);
+long long simple_strtoll(const char *cp, char **endp, unsigned int base);
#endif /* _LINUX_KSTRTOX_H */
--
2.50.1
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations
2026-03-23 14:54 ` [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations Andy Shevchenko
@ 2026-03-23 22:38 ` David Disseldorp
2026-03-26 16:33 ` Petr Mladek
1 sibling, 0 replies; 18+ messages in thread
From: David Disseldorp @ 2026-03-23 22:38 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Petr Mladek, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon, 23 Mar 2026 15:54:22 +0100, Andy Shevchenko wrote:
> There is legacy 'extern' keyword for the exported simple_strtox()
> function which are the artefact that can be removed. So drop it.
>
> While at it, tweak the declaration to provide parameter names.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: David Disseldorp <ddiss@suse.de>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations
2026-03-23 14:54 ` [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations Andy Shevchenko
2026-03-23 22:38 ` David Disseldorp
@ 2026-03-26 16:33 ` Petr Mladek
1 sibling, 0 replies; 18+ messages in thread
From: Petr Mladek @ 2026-03-26 16:33 UTC (permalink / raw)
To: Andy Shevchenko
Cc: David Disseldorp, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon 2026-03-23 15:54:22, Andy Shevchenko wrote:
> There is legacy 'extern' keyword for the exported simple_strtox()
> function which are the artefact that can be removed. So drop it.
>
> While at it, tweak the declaration to provide parameter names.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
LGTM:
Reviewed-by: Petr Mladek <pmladek@suse.com>
Best Regards,
Petr
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 0/6] initramfs: test and improve cpio hex header validation
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
` (5 preceding siblings ...)
2026-03-23 14:54 ` [PATCH v3 6/6] kstrtox: Drop extern keyword in the simple_strtox() declarations Andy Shevchenko
@ 2026-03-23 22:07 ` Andrew Morton
2026-03-23 23:07 ` David Disseldorp
2026-03-24 8:38 ` Christian Brauner
2026-03-26 16:39 ` Petr Mladek
7 siblings, 2 replies; 18+ messages in thread
From: Andrew Morton @ 2026-03-23 22:07 UTC (permalink / raw)
To: Andy Shevchenko
Cc: David Disseldorp, Petr Mladek, linux-kernel, linux-fsdevel,
Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky
On Mon, 23 Mar 2026 15:54:16 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
> The series that introduced simple_strntoul() had passed into kernel
> without proper review and hence reinvented a wheel that's not needed.
> Here is the refactoring to show that. It can go via PRINTK or VFS
> tree.
>
> I have tested this on x86, but I believe the same result will be
> on big-endian CPUs (I deduced that from how strtox() works).
AI review asked a few questions:
https://sashiko.dev/#/patchset/20260323150054.3587083-1-andriy.shevchenko@linux.intel.com
The "Is it possible for kzalloc() to fail and return NULL here?" one
should be ignored - I've asked Roman&Chris to teach the reviewbot that
unchecked allocations in __init code are OK.
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v3 0/6] initramfs: test and improve cpio hex header validation
2026-03-23 22:07 ` [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andrew Morton
@ 2026-03-23 23:07 ` David Disseldorp
2026-03-24 8:38 ` Christian Brauner
1 sibling, 0 replies; 18+ messages in thread
From: David Disseldorp @ 2026-03-23 23:07 UTC (permalink / raw)
To: Andrew Morton
Cc: Andy Shevchenko, Petr Mladek, linux-kernel, linux-fsdevel,
Al Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky
On Mon, 23 Mar 2026 15:07:53 -0700, Andrew Morton wrote:
> On Mon, 23 Mar 2026 15:54:16 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
>
> > The series that introduced simple_strntoul() had passed into kernel
> > without proper review and hence reinvented a wheel that's not needed.
> > Here is the refactoring to show that. It can go via PRINTK or VFS
> > tree.
> >
> > I have tested this on x86, but I believe the same result will be
> > on big-endian CPUs (I deduced that from how strtox() works).
>
> AI review asked a few questions:
>
> https://sashiko.dev/#/patchset/20260323150054.3587083-1-andriy.shevchenko@linux.intel.com
>
> The "Is it possible for kzalloc() to fail and return NULL here?" one
> should be ignored - I've asked Roman&Chris to teach the reviewbot that
> unchecked allocations in __init code are OK.
The bot should ideally also consider KUNIT=y / INITRAMFS_TEST here. The
feedback regarding misuse of the new fill_cpio() fmt parameter is
valid, but my preference was to keep the initramfs test code simple.
If there's a concern that this test code may be copied into other parts
of the kernel, then I'd prefer to go with a different approach: drop the
fill_cpio() change and just call sprintf directly within
initramfs_test_hdr_hex().
Thanks, David
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 0/6] initramfs: test and improve cpio hex header validation
2026-03-23 22:07 ` [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andrew Morton
2026-03-23 23:07 ` David Disseldorp
@ 2026-03-24 8:38 ` Christian Brauner
1 sibling, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2026-03-24 8:38 UTC (permalink / raw)
To: Andrew Morton
Cc: Andy Shevchenko, David Disseldorp, Petr Mladek, linux-kernel,
linux-fsdevel, Al Viro, Jan Kara, Steven Rostedt,
Rasmus Villemoes, Sergey Senozhatsky
On Mon, Mar 23, 2026 at 03:07:53PM -0700, Andrew Morton wrote:
> On Mon, 23 Mar 2026 15:54:16 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
>
> > The series that introduced simple_strntoul() had passed into kernel
> > without proper review and hence reinvented a wheel that's not needed.
> > Here is the refactoring to show that. It can go via PRINTK or VFS
> > tree.
> >
> > I have tested this on x86, but I believe the same result will be
> > on big-endian CPUs (I deduced that from how strtox() works).
>
> AI review asked a few questions:
>
> https://sashiko.dev/#/patchset/20260323150054.3587083-1-andriy.shevchenko@linux.intel.com
That review is mostly garbage. The VFS layer has it's own AI review
integration in its CI and it is filtered. We don't need to point
reviewers to 10 other AI tools. If there's relevant finds by AI it'll be
pointed out on list.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 0/6] initramfs: test and improve cpio hex header validation
2026-03-23 14:54 [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andy Shevchenko
` (6 preceding siblings ...)
2026-03-23 22:07 ` [PATCH v3 0/6] initramfs: test and improve cpio hex header validation Andrew Morton
@ 2026-03-26 16:39 ` Petr Mladek
7 siblings, 0 replies; 18+ messages in thread
From: Petr Mladek @ 2026-03-26 16:39 UTC (permalink / raw)
To: Andy Shevchenko
Cc: David Disseldorp, linux-kernel, linux-fsdevel, Al Viro,
Christian Brauner, Jan Kara, Steven Rostedt, Rasmus Villemoes,
Sergey Senozhatsky, Andrew Morton
On Mon 2026-03-23 15:54:16, Andy Shevchenko wrote:
> The series that introduced simple_strntoul() had passed into kernel
> without proper review and hence reinvented a wheel that's not needed.
> Here is the refactoring to show that. It can go via PRINTK or VFS
> tree.
I could take it via printk tree. But some VFS maintainer would need
to ack the first 4 patches. Especially, I want to know whether:
+ They mind about the switch from hardcoded format
to "*fmt" parameter (1st patch).
+ The behavior change is acceptable from their POV (4th).
Might it break some userspace?
Best Regards,
Petr
^ permalink raw reply [flat|nested] 18+ messages in thread