diff options
author | Andrej Picej <andrej.picej@norik.com> | 2022-01-28 09:00:33 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-01-31 10:19:27 +0100 |
commit | 738601e1258c55953284ee10801b26b9977918c2 (patch) | |
tree | fcebc7e92bc10f11e3006801858680aef6e33604 /scripts | |
parent | 6a1bd66e15a96bedd0625bdee9ca10d78c908df8 (diff) | |
download | barebox-738601e1258c55953284ee10801b26b9977918c2.tar.gz barebox-738601e1258c55953284ee10801b26b9977918c2.tar.xz |
scripts/common: fix write_file when opened with mmap
Usage of bareboximd with -c option (Create checksum for FILE and write
it to the crc32 tag) was broken. Possibly by applying 2154de1cf36c
(bareboximd: Use mmap when possibly). The script fails with:
$ ./scripts/bareboximd -c images/<barebox-image.img>
Cannot write to images/<barebox-mage.img>: Bad address
CRC: write crc token to images/<barebox-image.img> failed: -14
Bad address
This has to do with the usage of "mmap" and "open" with O_TRUNC flag
which truncates the file length to 0. Writing to files fails with:
EFAULT (14) buf is outside your accessible address space.
Remove the truncate flag and truncate manually after writing the data.
This fixes the bareboximd script, which is now again usable with -c
option.
Signed-off-by: Anze Lesnik <anze.lesnik@norik.com>
Signed-off-by: Andrej Picej <andrej.picej@norik.com>
Link: https://lore.barebox.org/20220128080033.167251-1-andrej.picej@norik.com
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/common.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/scripts/common.c b/scripts/common.c index b780b09941..154d6dffcb 100644 --- a/scripts/common.c +++ b/scripts/common.c @@ -105,26 +105,33 @@ int write_file(const char *filename, const void *buf, size_t size) { int fd, ret = 0; int now; + size_t left = size; - fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, + /* The same file may be mmapped currently, so can't use O_TRUNC here */ + fd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd < 0) { fprintf(stderr, "Cannot open %s: %s\n", filename, strerror(errno)); return -errno; } - while (size) { - now = write(fd, buf, size); + while (left) { + now = write(fd, buf, left); if (now < 0) { fprintf(stderr, "Cannot write to %s: %s\n", filename, strerror(errno)); ret = -errno; goto out; } - size -= now; + left -= now; buf += now; } + if (ftruncate(fd, size) < 0) { + fprintf(stderr, "Cannot truncate file: %s", strerror(errno)); + ret = -errno; + } + out: close(fd); |