mtd: improve check for TRX header being already fixed
authorRafał Miłecki <rafal@milecki.pl>
Sun, 15 Jul 2018 21:23:42 +0000 (23:23 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Tue, 17 Jul 2018 05:17:48 +0000 (07:17 +0200)
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)

package/system/mtd/Makefile
package/system/mtd/src/trx.c

index 5d1538ea95ff0882326717cbbe6d2c6948f63b5a..c3648760a73c32b119cb837b251956e27812442f 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mtd
-PKG_RELEASE:=22$(if $(SDK),,.1)
+PKG_RELEASE:=23$(if $(SDK),,.1)
 
 PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
 STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
index c1296a5f707a3feea138fabf5ba231d4d86f7048..aaca232b6f9a99e5d786fe4d19ff34f904e6bc42 100644 (file)
@@ -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));