diff options
author | Rafał Miłecki <rafal@milecki.pl> | 2018-07-15 23:23:42 +0200 |
---|---|---|
committer | Rafał Miłecki <rafal@milecki.pl> | 2018-07-16 23:18:45 +0200 |
commit | 1086408b17fae23e362f8ed95163ebeefed007c7 (patch) | |
tree | 71959c7c09b53cb9df19b33fa1852ca9c95f786e | |
parent | 5dca299fabc466183fdc973871b5f66e6ee4252d (diff) | |
download | openwrt-1086408b17fae23e362f8ed95163ebeefed007c7.tar.gz openwrt-1086408b17fae23e362f8ed95163ebeefed007c7.tar.bz2 openwrt-1086408b17fae23e362f8ed95163ebeefed007c7.zip |
mtd: improve check for TRX header being already fixed
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 <rafal@milecki.pl>
(cherry picked from commit 82498a7f7aa86ad0e93ef60d50dccaa0a9549e4c)
-rw-r--r-- | package/system/mtd/Makefile | 2 | ||||
-rw-r--r-- | package/system/mtd/src/trx.c | 15 |
2 files changed, 9 insertions, 8 deletions
diff --git a/package/system/mtd/Makefile b/package/system/mtd/Makefile index 969e1c711c..65de47f23f 100644 --- a/package/system/mtd/Makefile +++ b/package/system/mtd/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mtd -PKG_RELEASE:=22 +PKG_RELEASE:=23 PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME) STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS) 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)); |