Align the bootconfig applied initrd image size to 4. To pad the data,Typo in the comment line 391: algin
bootconfig will use space (0x20) in front of the bootconfig data,
and expands its size and update checksum.
Signed-off-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx>
---
include/linux/bootconfig.h | 1 +
tools/bootconfig/main.c | 33 ++++++++++++++++++++++++++++-----
tools/bootconfig/test-bootconfig.sh | 6 +++++-
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h
index 9903088891fa..461f621047f3 100644
--- a/include/linux/bootconfig.h
+++ b/include/linux/bootconfig.h
@@ -12,6 +12,7 @@
#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n"
#define BOOTCONFIG_MAGIC_LEN 12
+#define BOOTCONFIG_ALIGN 4
/* XBC tree node */
struct xbc_node {
diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index eb92027817a7..4b48e6a5ad1b 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -332,11 +332,13 @@ static int delete_xbc(const char *path)
static int apply_xbc(const char *path, const char *xbc_path)
{
+ const char padbuf[BOOTCONFIG_ALIGN] = { 0 };
u32 size, csum;
char *buf, *data;
int ret, fd;
const char *msg;
- int pos;
+ struct stat st;
+ int pos, pad;
ret = load_xbc_file(xbc_path, &buf);
if (ret < 0) {
@@ -347,12 +349,10 @@ static int apply_xbc(const char *path, const char *xbc_path)
csum = checksum((unsigned char *)buf, size);
/* Prepare xbc_path data */
- data = malloc(size + 8);
+ data = malloc(size);
if (!data)
return -ENOMEM;
strcpy(data, buf);
- *(u32 *)(data + size) = size;
- *(u32 *)(data + size + 4) = csum;
/* Check the data format */
ret = xbc_init(buf, &msg, &pos);
@@ -387,12 +387,35 @@ static int apply_xbc(const char *path, const char *xbc_path)
free(data);
return fd;
}
+
+ /* To algin up the total size to BOOTCONFIG_ALIGN, get padding size */
+ ret = fstat(fd, &st);
+ if (ret < 0) {
+ pr_err("Failed to get the stat of %s\n", path);
+ free(data);
+ return ret;
+ }
+ pad = BOOTCONFIG_ALIGN - (st.st_size + size) % BOOTCONFIG_ALIGN;
+
/* TODO: Ensure the @path is initramfs/initrd image */
- ret = write(fd, data, size + 8);
+ ret = write(fd, data, size);
if (ret < 0) {
pr_err("Failed to apply a boot config: %d\n", ret);
goto out;
}
+
+ if (pad != BOOTCONFIG_ALIGN) {
+ /* Write padding null characters */
+ ret = write(fd, padbuf, pad);
+ if (ret < 0) {
+ pr_err("Failed to write padding: %d\n", ret);
+ goto out;
+ }
+ size += pad;
+ }
+ ret = write(fd, &size, sizeof(u32));
+ ret = write(fd, &csum, sizeof(u32));
+
/* Write a magic word of the bootconfig */
ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
if (ret < 0) {
diff --git a/tools/bootconfig/test-bootconfig.sh b/tools/bootconfig/test-bootconfig.sh
index d295e406a756..baed891d0ba4 100755
--- a/tools/bootconfig/test-bootconfig.sh
+++ b/tools/bootconfig/test-bootconfig.sh
@@ -9,6 +9,7 @@ else
TESTDIR=.
fi
BOOTCONF=${TESTDIR}/bootconfig
+ALIGN=4
INITRD=`mktemp ${TESTDIR}/initrd-XXXX`
TEMPCONF=`mktemp ${TESTDIR}/temp-XXXX.bconf`
@@ -59,7 +60,10 @@ echo "Show command test"
xpass $BOOTCONF $INITRD
echo "File size check"
-xpass test $new_size -eq $(expr $bconf_size + $initrd_size + 9 + 12)
+total_size=$(expr $bconf_size + $initrd_size + 9 + 12 + $ALIGN - 1 )
+total_size=$(expr $total_size / $ALIGN)
+total_size=$(expr $total_size \* $ALIGN)
+xpass test $new_size -eq $total_size
echo "Apply command repeat test"
xpass $BOOTCONF -a $TEMPCONF $INITRD