To make the bootconfig format more platform independent, use 8-bytes hexadecimal ASCII string for size and checksum field in the footer. This will allow us to apply bootconfig to the cross build initrd without caring the endianness. Signed-off-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx> --- init/main.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/init/main.c b/init/main.c index 20baced721ad..b82f23cff709 100644 --- a/init/main.c +++ b/init/main.c @@ -267,8 +267,8 @@ early_param("loglevel", loglevel); static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) { u32 size, csum; + char buf[9]; char *data; - u32 *hdr; int i; if (!initrd_end) @@ -287,11 +287,21 @@ static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) return NULL; found: - hdr = (u32 *)(data - 8); - size = hdr[0]; - csum = hdr[1]; + buf[8] = '\0'; + data -= 8; + memcpy(buf, data, 8); + if (kstrtou32(buf, 16, &csum) != 0) { + pr_err("bootconfig checksum field is invalid\n"); + return NULL; + } + data -= 8; + memcpy(buf, data, 8); + if (kstrtou32(buf, 16, &size) != 0) { + pr_err("bootconfig size field is invalid\n"); + return NULL; + } + data -= size; - data = ((void *)hdr) - size; if ((unsigned long)data < initrd_start) { pr_err("bootconfig size %d is greater than initrd size %ld\n", size, initrd_end - initrd_start);