diff options
Diffstat (limited to 'package/system/mtd')
-rw-r--r-- | package/system/mtd/src/trx.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/package/system/mtd/src/trx.c b/package/system/mtd/src/trx.c index 00c4d6c0b5..f310f51087 100644 --- a/package/system/mtd/src/trx.c +++ b/package/system/mtd/src/trx.c @@ -152,6 +152,7 @@ mtd_fixtrx(const char *mtd, size_t offset) { int fd; struct trx_header *trx; + char *first_block; char *buf; ssize_t res; size_t block_offset; @@ -173,19 +174,19 @@ mtd_fixtrx(const char *mtd, size_t offset) exit(1); } - buf = malloc(erasesize); - if (!buf) { + first_block = malloc(erasesize); + if (!first_block) { perror("malloc"); exit(1); } - res = pread(fd, buf, erasesize, block_offset); + res = pread(fd, first_block, erasesize, block_offset); if (res != erasesize) { perror("pread"); exit(1); } - trx = (struct trx_header *) (buf + offset); + trx = (struct trx_header *)(first_block + offset); if (trx->magic != STORE32_LE(0x30524448)) { fprintf(stderr, "No trx magic found\n"); exit(1); @@ -198,6 +199,18 @@ mtd_fixtrx(const char *mtd, size_t offset) return 0; } + buf = malloc(erasesize); + if (!buf) { + perror("malloc"); + exit(1); + } + + res = pread(fd, buf, erasesize, block_offset); + if (res != erasesize) { + perror("pread"); + exit(1); + } + trx->len = STORE32_LE(erasesize - offset); trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); @@ -209,7 +222,7 @@ mtd_fixtrx(const char *mtd, size_t offset) if (quiet < 2) fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); - if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { + if (pwrite(fd, first_block, erasesize, block_offset) != erasesize) { fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); exit(1); } |