From 664fc8181fa27d42b76cd6c3e8c2124a90bc8d9c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 9 May 2016 09:55:35 +0000 Subject: [PATCH] mtd: check for Seama magic early when fixing MD5 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This avoid long (and unneeded) process of reading all data in case of running on MTD not containig Seama entity. Signed-off-by: Rafał Miłecki Backport of r49304 SVN-Revision: 49305 --- package/system/mtd/src/seama.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/package/system/mtd/src/seama.c b/package/system/mtd/src/seama.c index b0c8bf3d0d..8894883c26 100644 --- a/package/system/mtd/src/seama.c +++ b/package/system/mtd/src/seama.c @@ -53,7 +53,7 @@ ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); int seama_fix_md5(char *buf, size_t len) { - struct seama_hdr *shdr; + struct seama_hdr *shdr = (struct seama_hdr *) buf; char *data; size_t msize; size_t isize; @@ -64,12 +64,6 @@ seama_fix_md5(char *buf, size_t len) if (len < sizeof(struct seama_hdr)) return -1; - shdr = (struct seama_hdr *) buf; - if (shdr->magic != htonl(SEAMA_MAGIC)) { - fprintf(stderr, "no SEAMA header found\n"); - return -1; - } - isize = ntohl(shdr->size); msize = ntohs(shdr->metasize); if (isize == 0) { @@ -115,9 +109,11 @@ int mtd_fixseama(const char *mtd, size_t offset) { int fd; + char *first_block; char *buf; ssize_t res; size_t block_offset; + struct seama_hdr *shdr; if (quiet < 2) fprintf(stderr, "Trying to fix SEAMA header in %s at 0x%x...\n", @@ -138,6 +134,24 @@ mtd_fixseama(const char *mtd, size_t offset) exit(1); } + first_block = malloc(erasesize); + if (!first_block) { + perror("malloc"); + exit(1); + } + + res = pread(fd, first_block, erasesize, block_offset); + if (res != erasesize) { + perror("pread"); + exit(1); + } + + shdr = (struct seama_hdr *)first_block; + if (shdr->magic != htonl(SEAMA_MAGIC)) { + fprintf(stderr, "No SEAMA header found\n"); + return -1; + } + buf = malloc(mtdsize); if (!buf) { perror("malloc"); -- 2.30.2