lkml.org 
[lkml]   [2020]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v3 1/3] tools/bootconfig: Fix to check the write failure correctly
Date
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.

Fixes: 85c46b78da58 ("bootconfig: Add bootconfig magic word for indicating bootconfig explicitly")
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
tools/bootconfig/main.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index eb92027817a7..f7b89a50404c 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -332,6 +332,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;
@@ -388,16 +389,26 @@ static int apply_xbc(const char *path, const char *xbc_path)
return fd;
}
/* 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:
@@ -405,6 +416,14 @@ static int apply_xbc(const char *path, const char *xbc_path)
free(data);

return ret;
+
+out_rollback:
+ 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)
\
 
 \ /
  Last update: 2020-11-17 10:56    [W:0.098 / U:0.160 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site