From d60cac85a21c934ec699b65324d4282e32950bab Mon Sep 17 00:00:00 2001 From: rmilecki Date: Mon, 9 May 2016 09:54:48 +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 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@49304 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- 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.11.0