From 82498a7f7aa86ad0e93ef60d50dccaa0a9549e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Sun, 15 Jul 2018 23:23:42 +0200 Subject: mtd: improve check for TRX header being already fixed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First of all lengths should be compared after checking all blocks for being good/bad. It's because requested length may differ from a final one if there were some bad blocks. Secondly it makes sense to also compare crc32 since we already have a new one calculated. Signed-off-by: Rafał Miłecki --- package/system/mtd/src/trx.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'package/system/mtd/src/trx.c') diff --git a/package/system/mtd/src/trx.c b/package/system/mtd/src/trx.c index c1296a5f70..aaca232b6f 100644 --- a/package/system/mtd/src/trx.c +++ b/package/system/mtd/src/trx.c @@ -207,13 +207,6 @@ mtd_fixtrx(const char *mtd, size_t offset, size_t data_size) exit(1); } - if (trx->len == STORE32_LE(data_size + TRX_CRC32_DATA_OFFSET)) { - if (quiet < 2) - fprintf(stderr, "Header already fixed, exiting\n"); - close(fd); - return 0; - } - buf = malloc(data_size); if (!buf) { perror("malloc"); @@ -243,6 +236,14 @@ mtd_fixtrx(const char *mtd, size_t offset, size_t data_size) } data_size = to - buf; + if (trx->len == STORE32_LE(data_size + TRX_CRC32_DATA_OFFSET) && + trx->crc32 == STORE32_LE(crc32buf(buf, data_size))) { + if (quiet < 2) + fprintf(stderr, "Header already fixed, exiting\n"); + close(fd); + return 0; + } + trx->len = STORE32_LE(data_size + offsetof(struct trx_header, flag_version)); trx->crc32 = STORE32_LE(crc32buf(buf, data_size)); -- cgit v1.2.3