Skip to content

Commit

Permalink
mtd: check for Seama magic early when fixing MD5
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
rmilecki authored and rmilecki committed May 9, 2016
1 parent 3206415 commit 8632d89
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions package/system/mtd/src/seama.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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",
Expand All @@ -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");
Expand Down

0 comments on commit 8632d89

Please sign in to comment.