init/main: read bootconfig header with get_unaligned_le32()
PATCH 1/1 init/main: read bootconfig header with get_unaligned_le32()
get_boot_config_from_initrd() scans up to 3 bytes before initrd_end to handle GRUB 4-byte alignment. As a result, the bootconfig header immediately preceding the magic may be unaligned.
Read the size and checksum fields with get_unaligned_le32() instead of casting to u32 * and using le32_to_cpu(), avoiding potential unaligned access and silencing sparse "cast to restricted __le32" warnings.
Sparse warnings (gcc + C=1):
init/main.c:292:16: warning: cast to restricted __le32 init/main.c:293:16: warning: cast to restricted __le32
No functional change intended.
Signed-off-by Sun Jian <[email protected]>
--- init/main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
init/main.c +5 -4
@@ -104,6 +104,7 @@#include <linux/pidfs.h> #include <linux/ptdump.h> #include <linux/time_namespace.h> +#include <linux/unaligned.h> #include <net/net_namespace.h> #include <asm/io.h>
@@ -269,7 +270,7 @@ static void * __init get_boot_config_from_initrd(size_t *_size) {u32 size, csum;char *data; -u32 *hdr; +u8 *hdr;int i;if (!initrd_end)
@@ -288,9 +289,9 @@ static void * __init get_boot_config_from_initrd(size_t *_size)return NULL ; found: - hdr = (u32 *)(data -8 ); - size =le32_to_cpu (hdr[0 ]); - csum =le32_to_cpu (hdr[1 ]); + hdr = (u8 *)(data -8 ); + size =get_unaligned_le32 (hdr); + csum =get_unaligned_le32 (hdr +4 ); data = ((void *)hdr) - size;if ((unsigned long )data < initrd_start) {
Signature · 1 line
2.43.0