Skip to content

Commit

Permalink
tools/bootconfig: Align the bootconfig applied initrd image size to 4
Browse files Browse the repository at this point in the history
Align the bootconfig applied initrd image size to 4. To fill the gap,
the bootconfig command uses null characters in between the bootconfig
data and the footer. This will expands the footer size but don't change
the checksum.
Thus the block image of the initrd file with bootconfig is as follows.

[initrd][bootconfig][(pad)][size][csum]["#BOOTCONFIG\n"]

Link: https://lkml.kernel.org/r/160576522046.320071.8550680670010950634.stgit@devnote2

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
  • Loading branch information
Masami Hiramatsu authored and Steven Rostedt (VMware) committed Nov 19, 2020
1 parent a995e6b commit e1cef2d
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 24 deletions.
3 changes: 3 additions & 0 deletions include/linux/bootconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@

#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n"
#define BOOTCONFIG_MAGIC_LEN 12
#define BOOTCONFIG_ALIGN_SHIFT 2
#define BOOTCONFIG_ALIGN (1 << BOOTCONFIG_ALIGN_SHIFT)
#define BOOTCONFIG_ALIGN_MASK (BOOTCONFIG_ALIGN - 1)

/* XBC tree node */
struct xbc_node {
Expand Down
57 changes: 34 additions & 23 deletions tools/bootconfig/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,12 +337,13 @@ static int delete_xbc(const char *path)

static int apply_xbc(const char *path, const char *xbc_path)
{
char *buf, *data, *p;
size_t total_size;
struct stat stat;
const char *msg;
u32 size, csum;
char *buf, *data;
int pos, pad;
int ret, fd;
const char *msg;
int pos;

ret = load_xbc_file(xbc_path, &buf);
if (ret < 0) {
Expand All @@ -352,13 +353,12 @@ static int apply_xbc(const char *path, const char *xbc_path)
size = strlen(buf) + 1;
csum = checksum((unsigned char *)buf, size);

/* Prepare xbc_path data */
data = malloc(size + 8);
/* Backup the bootconfig data */
data = calloc(size + BOOTCONFIG_ALIGN +
sizeof(u32) + sizeof(u32) + BOOTCONFIG_MAGIC_LEN, 1);
if (!data)
return -ENOMEM;
strcpy(data, buf);
*(u32 *)(data + size) = size;
*(u32 *)(data + size + 4) = csum;
memcpy(data, buf, size);

/* Check the data format */
ret = xbc_init(buf, &msg, &pos);
Expand Down Expand Up @@ -399,24 +399,35 @@ static int apply_xbc(const char *path, const char *xbc_path)
pr_err("Failed to get the size of %s\n", path);
goto out;
}
ret = write(fd, data, size + 8);
if (ret < size + 8) {

/* To align up the total size to BOOTCONFIG_ALIGN, get padding size */
total_size = stat.st_size + size + sizeof(u32) * 2 + BOOTCONFIG_MAGIC_LEN;
pad = ((total_size + BOOTCONFIG_ALIGN - 1) & (~BOOTCONFIG_ALIGN_MASK)) - total_size;
size += pad;

/* Add a footer */
p = data + size;
*(u32 *)p = size;
p += sizeof(u32);

*(u32 *)p = csum;
p += sizeof(u32);

memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
p += BOOTCONFIG_MAGIC_LEN;

total_size = p - data;

ret = write(fd, data, total_size);
if (ret < total_size) {
if (ret < 0)
ret = -errno;
pr_err("Failed to apply a boot config: %d\n", ret);
if (ret < 0)
goto out;
goto out_rollback;
}
/* Write a magic word of the bootconfig */
ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
if (ret < BOOTCONFIG_MAGIC_LEN) {
if (ret < 0)
ret = -errno;
pr_err("Failed to apply a boot config magic: %d\n", ret);
goto out_rollback;
}
ret = 0;
if (ret >= 0)
goto out_rollback;
} else
ret = 0;

out:
close(fd);
free(data);
Expand Down
6 changes: 5 additions & 1 deletion tools/bootconfig/test-bootconfig.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ else
TESTDIR=.
fi
BOOTCONF=${TESTDIR}/bootconfig
ALIGN=4

INITRD=`mktemp ${TESTDIR}/initrd-XXXX`
TEMPCONF=`mktemp ${TESTDIR}/temp-XXXX.bconf`
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit e1cef2d

Please sign in to comment.