diff options
author | rmilecki <rmilecki@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2016-05-09 09:54:48 +0000 |
---|---|---|
committer | Rafał Miłecki <zajec5@gmail.com> | 2016-05-09 18:53:09 +0200 |
commit | 8632d89fa0d22e192c16c0bb6a50f02486dd73a6 (patch) | |
tree | dccbe59a1c2c52b26d95bbac829eb55fa9babdb2 /package/system/mtd | |
parent | 320641585be3f87f286c58ef7eb7bdb9cc8f35a3 (diff) | |
download | upstream-8632d89fa0d22e192c16c0bb6a50f02486dd73a6.tar.gz upstream-8632d89fa0d22e192c16c0bb6a50f02486dd73a6.tar.bz2 upstream-8632d89fa0d22e192c16c0bb6a50f02486dd73a6.zip |
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 <zajec5@gmail.com>
Diffstat (limited to 'package/system/mtd')
-rw-r--r-- | package/system/mtd/src/seama.c | 28 |
1 files 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"); |