Skip to content

Commit

Permalink
tools/bootconfig: Fix to check the write failure correctly
Browse files Browse the repository at this point in the history
Fix to check the write(2) failure including partial write
correctly and try to rollback the partial write, because
if there is no BOOTCONFIG_MAGIC string, we can not remove it.

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

Fixes: 85c46b7 ("bootconfig: Add bootconfig magic word for indicating bootconfig explicitly")
Suggested-by: Linus Torvalds <[email protected]>
Signed-off-by: Masami Hiramatsu <[email protected]>
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
  • Loading branch information
mhiramat authored and rostedt committed Nov 19, 2020
1 parent a61ea63 commit a995e6b
Showing 1 changed file with 26 additions and 4 deletions.
30 changes: 26 additions & 4 deletions tools/bootconfig/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ static int delete_xbc(const char *path)

static int apply_xbc(const char *path, const char *xbc_path)
{
struct stat stat;
u32 size, csum;
char *buf, *data;
int ret, fd;
Expand Down Expand Up @@ -394,23 +395,44 @@ static int apply_xbc(const char *path, const char *xbc_path)
return ret;
}
/* TODO: Ensure the @path is initramfs/initrd image */
if (fstat(fd, &stat) < 0) {
pr_err("Failed to get the size of %s\n", path);
goto out;
}
ret = write(fd, data, size + 8);
if (ret < 0) {
if (ret < size + 8) {
if (ret < 0)
ret = -errno;
pr_err("Failed to apply a boot config: %d\n", ret);
goto out;
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 < 0) {
if (ret < BOOTCONFIG_MAGIC_LEN) {
if (ret < 0)
ret = -errno;
pr_err("Failed to apply a boot config magic: %d\n", ret);
goto out;
goto out_rollback;
}
ret = 0;
out:
close(fd);
free(data);

return ret;

out_rollback:
/* Map the partial write to -ENOSPC */
if (ret >= 0)
ret = -ENOSPC;
if (ftruncate(fd, stat.st_size) < 0) {
ret = -errno;
pr_err("Failed to rollback the write error: %d\n", ret);
pr_err("The initrd %s may be corrupted. Recommend to rebuild.\n", path);
}
goto out;
}

static int usage(void)
Expand Down

0 comments on commit a995e6b

Please sign in to comment.