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 82498a7f7a)
			
			
This commit is contained in:
		| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | |||||||
| include $(INCLUDE_DIR)/kernel.mk | include $(INCLUDE_DIR)/kernel.mk | ||||||
|  |  | ||||||
| PKG_NAME:=mtd | PKG_NAME:=mtd | ||||||
| PKG_RELEASE:=22 | PKG_RELEASE:=23 | ||||||
|  |  | ||||||
| PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME) | PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME) | ||||||
| STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS) | STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS) | ||||||
|   | |||||||
| @@ -207,13 +207,6 @@ mtd_fixtrx(const char *mtd, size_t offset, size_t data_size) | |||||||
| 		exit(1); | 		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); | 	buf = malloc(data_size); | ||||||
| 	if (!buf) { | 	if (!buf) { | ||||||
| 		perror("malloc"); | 		perror("malloc"); | ||||||
| @@ -243,6 +236,14 @@ mtd_fixtrx(const char *mtd, size_t offset, size_t data_size) | |||||||
| 	} | 	} | ||||||
| 	data_size = to - buf; | 	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->len = STORE32_LE(data_size + offsetof(struct trx_header, flag_version)); | ||||||
|  |  | ||||||
| 	trx->crc32 = STORE32_LE(crc32buf(buf, data_size)); | 	trx->crc32 = STORE32_LE(crc32buf(buf, data_size)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Rafał Miłecki
					Rafał Miłecki