On 18.08.25 14:43, Greg Kroah-Hartman wrote:
6.16-stable review patch. If anyone has any objections, please let me know.
From: Ben Hutchings benh@debian.org
[ Upstream commit 6ed5e20466c79e3b3350bae39f678f73cf564b4e ]
Currently we add padding between the bootconfig text and footer to ensure that the footer is aligned within the initramfs image. However, because only the bootconfig data is held in memory, not the full initramfs image, the footer may not be naturally aligned in memory.
This change broke the build for me in both 6.16.y and 6.15.y (did not try 6.12.y, guess it has the same problem)[1]. Reverting it or applying 26dda57695090e ("tools/bootconfig: Cleanup bootconfig footer size calculations") [v6.17-rc1] fixed things for me.
Ciao, Thorsten
[1] see https://download.copr.fedorainfracloud.org/results/@kernel-vanilla/stable-rc...
main.c: In function ‘apply_xbc’: main.c:442:41: error: ‘BOOTCONFIG_FOOTER_SIZE’ undeclared (first use in this function) 442 | static_assert(sizeof(footer) == BOOTCONFIG_FOOTER_SIZE); | ^~~~~~~~~~~~~~~~~~~~~~ main.c:442:41: note: each undeclared identifier is reported only once for each function it appears in main.c:442:23: error: expression in static assertion is not an integer 442 | static_assert(sizeof(footer) == BOOTCONFIG_FOOTER_SIZE); | ^~~~~~ make: *** [Makefile:21: bootconfig] Error 1
This can result in an alignment fault (SIGBUS) when writing the footer on some architectures, such as sparc.
Build the footer in a struct on the stack before adding it to the buffer.
References: https://buildd.debian.org/status/fetch.php?pkg=linux&arch=sparc64&ve... Link: https://lore.kernel.org/all/aIC-NTw-cdm9ZGFw@decadent.org.uk/
Signed-off-by: Ben Hutchings benh@debian.org Signed-off-by: Masami Hiramatsu (Google) mhiramat@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org
tools/bootconfig/main.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c index 8a48cc2536f5..dce2d6ffcca5 100644 --- a/tools/bootconfig/main.c +++ b/tools/bootconfig/main.c @@ -11,6 +11,7 @@ #include <string.h> #include <errno.h> #include <endian.h> +#include <assert.h> #include <linux/bootconfig.h> @@ -359,7 +360,12 @@ static int delete_xbc(const char *path) static int apply_xbc(const char *path, const char *xbc_path) {
- char *buf, *data, *p;
- struct {
uint32_t size;
uint32_t csum;
char magic[BOOTCONFIG_MAGIC_LEN];
- } footer;
- char *buf, *data; size_t total_size; struct stat stat; const char *msg;
@@ -430,17 +436,13 @@ static int apply_xbc(const char *path, const char *xbc_path) size += pad; /* Add a footer */
- p = data + size;
- *(uint32_t *)p = htole32(size);
- p += sizeof(uint32_t);
- footer.size = htole32(size);
- footer.csum = htole32(csum);
- memcpy(footer.magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
- static_assert(sizeof(footer) == BOOTCONFIG_FOOTER_SIZE);
- memcpy(data + size, &footer, BOOTCONFIG_FOOTER_SIZE);
- *(uint32_t *)p = htole32(csum);
- p += sizeof(uint32_t);
- memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
- p += BOOTCONFIG_MAGIC_LEN;
- total_size = p - data;
- total_size = size + BOOTCONFIG_FOOTER_SIZE;
ret = write(fd, data, total_size); if (ret < total_size) {