[OpenWrt-Devel] [PATCH] mtd: fix reading of image magic bytes in smaller chunks

Sven Eckelmann sven.eckelmann at open-mesh.com
Tue Mar 1 08:59:27 EST 2016


From: Sven Eckelmann <sven.eckelmann at open-mesh.com>

The image_check currently fails when it cannot read all magic bytes in a
single chunk. But this can happen when the data are read from a pipe. This
currently breaks the openmesh.sh upgrade script with musl because it uses
dd with a blocksize of 1 to copy the image file to the mtd process.

The read can simply be repeated until enough bytes are read for the magic
byte check. It only stops when either an error was returned or 0 bytes were
read.

Signed-off-by: Sven Eckelmann <sven.eckelmann at open-mesh.com>
---
 package/system/mtd/src/mtd.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/package/system/mtd/src/mtd.c b/package/system/mtd/src/mtd.c
index eda001e..dae0514 100644
--- a/package/system/mtd/src/mtd.c
+++ b/package/system/mtd/src/mtd.c
@@ -179,14 +179,21 @@ image_check(int imagefd, const char *mtd)
 {
 	uint32_t magic;
 	int ret = 1;
+	int bufread;
+
+	while (buflen < sizeof(magic)) {
+		bufread = read(imagefd, buf + buflen, sizeof(magic) - buflen);
+		if (bufread < 1)
+			break;
+
+		buflen += bufread;
+	}
 
 	if (buflen < sizeof(magic)) {
-		buflen += read(imagefd, buf + buflen, sizeof(magic) - buflen);
-		if (buflen < sizeof(magic)) {
-			fprintf(stdout, "Could not get image magic\n");
-			return 0;
-		}
+		fprintf(stdout, "Could not get image magic\n");
+		return 0;
 	}
+
 	magic = ((uint32_t *)buf)[0];
 
 	if (be32_to_cpu(magic) == TRX_MAGIC)
-- 
2.7.0
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list