Commit 9bfdba94 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull bootconfig updates from Masami Hiramatsu:

 - tools/bootconfig:
    - Fix unaligned access when building footer to avoid SIGBUS
    - Cleanup bootconfig footer size calculations

 - test scripts:
    - Fix to add shebang for a test script
    - Improve script portability using portable commands
    - Improve script portability using printf instead of echo
    - Enclose regex with quotes for syntax highlighter

* tag 'bootconfig-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  bootconfig: Fix unaligned access when building footer
  tools/bootconfig: scripts/ftrace.sh was missing the shebang line, so added it
  tools/bootconfig: Cleanup bootconfig footer size calculations
  tools/bootconfig: Replace some echo with printf for more portability
  tools/bootconfig: Improve portability
  tools: bootconfig: Regex enclosed with quotes to make syntax highlight proper
parents e8d780dc 6ed5e204
Loading
Loading
Loading
Loading
+24 −19
Original line number Diff line number Diff line
@@ -11,11 +11,16 @@
#include <string.h>
#include <errno.h>
#include <endian.h>
#include <assert.h>

#include <linux/bootconfig.h>

#define pr_err(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)

/* Bootconfig footer is [size][csum][BOOTCONFIG_MAGIC]. */
#define BOOTCONFIG_FOOTER_SIZE	\
	(sizeof(uint32_t) * 2 + BOOTCONFIG_MAGIC_LEN)

static int xbc_show_value(struct xbc_node *node, bool semicolon)
{
	const char *val, *eol;
@@ -185,7 +190,7 @@ static int load_xbc_from_initrd(int fd, char **buf)
	if (ret < 0)
		return -errno;

	if (stat.st_size < 8 + BOOTCONFIG_MAGIC_LEN)
	if (stat.st_size < BOOTCONFIG_FOOTER_SIZE)
		return 0;

	if (lseek(fd, -BOOTCONFIG_MAGIC_LEN, SEEK_END) < 0)
@@ -198,7 +203,7 @@ static int load_xbc_from_initrd(int fd, char **buf)
	if (memcmp(magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN) != 0)
		return 0;

	if (lseek(fd, -(8 + BOOTCONFIG_MAGIC_LEN), SEEK_END) < 0)
	if (lseek(fd, -BOOTCONFIG_FOOTER_SIZE, SEEK_END) < 0)
		return pr_errno("Failed to lseek for size", -errno);

	if (read(fd, &size, sizeof(uint32_t)) < 0)
@@ -210,12 +215,12 @@ static int load_xbc_from_initrd(int fd, char **buf)
	csum = le32toh(csum);

	/* Wrong size error  */
	if (stat.st_size < size + 8 + BOOTCONFIG_MAGIC_LEN) {
	if (stat.st_size < size + BOOTCONFIG_FOOTER_SIZE) {
		pr_err("bootconfig size is too big\n");
		return -E2BIG;
	}

	if (lseek(fd, stat.st_size - (size + 8 + BOOTCONFIG_MAGIC_LEN),
	if (lseek(fd, stat.st_size - (size + BOOTCONFIG_FOOTER_SIZE),
		  SEEK_SET) < 0)
		return pr_errno("Failed to lseek", -errno);

@@ -346,7 +351,7 @@ static int delete_xbc(const char *path)
		ret = fstat(fd, &stat);
		if (!ret)
			ret = ftruncate(fd, stat.st_size
					- size - 8 - BOOTCONFIG_MAGIC_LEN);
					- size - BOOTCONFIG_FOOTER_SIZE);
		if (ret)
			ret = -errno;
	} /* Ignore if there is no boot config in initrd */
@@ -359,7 +364,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;
@@ -376,8 +386,7 @@ static int apply_xbc(const char *path, const char *xbc_path)
	csum = xbc_calc_checksum(buf, size);

	/* Backup the bootconfig data */
	data = calloc(size + BOOTCONFIG_ALIGN +
		      sizeof(uint32_t) + sizeof(uint32_t) + BOOTCONFIG_MAGIC_LEN, 1);
	data = calloc(size + BOOTCONFIG_ALIGN + BOOTCONFIG_FOOTER_SIZE, 1);
	if (!data)
		return -ENOMEM;
	memcpy(data, buf, size);
@@ -425,22 +434,18 @@ static int apply_xbc(const char *path, const char *xbc_path)
	}

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

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

	*(uint32_t *)p = htole32(csum);
	p += sizeof(uint32_t);

	memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
	p += BOOTCONFIG_MAGIC_LEN;
	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);

	total_size = p - data;
	total_size = size + BOOTCONFIG_FOOTER_SIZE;

	ret = write(fd, data, total_size);
	if (ret < total_size) {
+1 −0
Original line number Diff line number Diff line
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only

clear_trace() { # reset trace output
+19 −18
Original line number Diff line number Diff line
@@ -27,16 +27,16 @@ NO=1

xpass() { # pass test command
  echo "test case $NO ($*)... "
  if ! ($@ && echo "\t\t[OK]"); then
     echo "\t\t[NG]"; NG=$((NG + 1))
  if ! ($@ && printf "\t\t[OK]\n"); then
     printf "\t\t[NG]\n"; NG=$((NG + 1))
  fi
  NO=$((NO + 1))
}

xfail() { # fail test command
  echo "test case $NO ($*)... "
  if ! (! $@ && echo "\t\t[OK]"); then
     echo "\t\t[NG]"; NG=$((NG + 1))
  if ! (! $@ && printf "\t\t[OK]\n"); then
     printf "\t\t[NG]\n"; NG=$((NG + 1))
  fi
  NO=$((NO + 1))
}
@@ -48,13 +48,13 @@ echo "Delete command should success without bootconfig"
xpass $BOOTCONF -d $INITRD

dd if=/dev/zero of=$INITRD bs=4096 count=1
echo "key = value;" > $TEMPCONF
bconf_size=$(stat -c %s $TEMPCONF)
initrd_size=$(stat -c %s $INITRD)
printf "key = value;" > $TEMPCONF
bconf_size=$(wc -c < $TEMPCONF)
initrd_size=$(wc -c < $INITRD)

echo "Apply command test"
xpass $BOOTCONF -a $TEMPCONF $INITRD
new_size=$(stat -c %s $INITRD)
new_size=$(wc -c < $INITRD)

echo "Show command test"
xpass $BOOTCONF $INITRD
@@ -69,13 +69,13 @@ echo "Apply command repeat test"
xpass $BOOTCONF -a $TEMPCONF $INITRD

echo "File size check"
xpass test $new_size -eq $(stat -c %s $INITRD)
xpass test $new_size -eq $(wc -c < $INITRD)

echo "Delete command check"
xpass $BOOTCONF -d $INITRD

echo "File size check"
new_size=$(stat -c %s $INITRD)
new_size=$(wc -c < $INITRD)
xpass test $new_size -eq $initrd_size

echo "No error messge while applying"
@@ -97,19 +97,20 @@ BEGIN {
' > $TEMPCONF
xpass $BOOTCONF -a $TEMPCONF $INITRD

echo "badnode" >> $TEMPCONF
printf "badnode\n" >> $TEMPCONF
xfail $BOOTCONF -a $TEMPCONF $INITRD

echo "Max filesize check"

# Max size is 32767 (including terminal byte)
echo -n "data = \"" > $TEMPCONF
printf "data = \"" > $TEMPCONF
dd if=/dev/urandom bs=768 count=32 | base64 -w0 >> $TEMPCONF
echo "\"" >> $TEMPCONF
printf "\"\n" >> $TEMPCONF
xfail $BOOTCONF -a $TEMPCONF $INITRD

truncate -s 32764 $TEMPCONF
echo "\"" >> $TEMPCONF	# add 2 bytes + terminal ('\"\n\0')
dd if=$TEMPCONF of=$OUTFILE bs=1 count=32764
cp $OUTFILE $TEMPCONF
printf "\"\n" >> $TEMPCONF	# add 2 bytes + terminal ('\"\n\0')
xpass $BOOTCONF -a $TEMPCONF $INITRD

echo "Adding same-key values"
@@ -139,7 +140,7 @@ xfail grep -q "baz" $OUTFILE
xpass grep -q "qux" $OUTFILE

echo "Double/single quotes test"
echo "key = '\"string\"';" > $TEMPCONF
printf "key = '\"string\"';" > $TEMPCONF
$BOOTCONF -a $TEMPCONF $INITRD
$BOOTCONF $INITRD > $TEMPCONF
cat $TEMPCONF
@@ -167,8 +168,8 @@ echo > $INITRD

xpass $BOOTCONF -a $TEMPCONF $INITRD
$BOOTCONF $INITRD > $OUTFILE
xfail grep -q val[[:space:]] $OUTFILE
xpass grep -q val2[[:space:]] $OUTFILE
xfail grep -q 'val[[:space:]]' $OUTFILE
xpass grep -q 'val2[[:space:]]' $OUTFILE

echo "=== expected failure cases ==="
for i in samples/bad-* ; do