From: rmilecki Date: Mon, 9 May 2016 09:54:48 +0000 (+0000) Subject: mtd: check for Seama magic early when fixing MD5 X-Git-Tag: v17.01.0-rc1~2936 X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=8632d89fa0d22e192c16c0bb6a50f02486dd73a6;p=openwrt%2Fstaging%2Fxback.git mtd: check for Seama magic early when fixing MD5 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 --- 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");