summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-06-12 10:04:58 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-07-05 16:17:12 +0200
commite9fb40763b6de1aaf889ba07529eed68f20f55c3 (patch)
treedad6286f18727e23d3d9c404d37f115f682348bb
parent5edb9f03a0e7d83c817ff17e19a852e2f564aef8 (diff)
downloadbarebox-e9fb40763b6de1aaf889ba07529eed68f20f55c3.tar.gz
barebox-e9fb40763b6de1aaf889ba07529eed68f20f55c3.tar.xz
libfile: copy_file: Fix calling discard_range
discard range is called with unitialized size argument. Call it after stat() on the source filedescriptor. Also there's no point in continuing when stat() on the source filedescriptor fails, so bail out in this case. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--lib/libfile.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/libfile.c b/lib/libfile.c
index b4d87b624a..9de938b2d3 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -364,14 +364,15 @@ int copy_file(const char *src, const char *dst, int verbose)
goto out;
}
- discard_range(dstfd, srcstat.st_size, 0);
+ ret = stat(src, &srcstat);
+ if (ret)
+ goto out;
- if (verbose) {
- if (stat(src, &srcstat) < 0)
- srcstat.st_size = 0;
+ if (srcstat.st_size != FILESIZE_MAX)
+ discard_range(dstfd, srcstat.st_size, 0);
+ if (verbose)
init_progression_bar(srcstat.st_size);
- }
while (1) {
r = read(srcfd, rw_buf, RW_BUF_SIZE);