mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-25 13:49:26 +00:00
mtd: fix resetbc on nand w/ min I/O size > 2048
Fix a bug in linksys_bootcount.c that resetbc won't work on nand with min I/O size> 2048. Check the boot-log entry's intergrity with checksum. Signed-off-by: Qiyuan Zhang <zhang.github@outlook.com> Link: https://github.com/openwrt/openwrt/pull/16070 Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
parent
f96b3383d5
commit
5b3044e8e3
@ -69,12 +69,10 @@ struct bootcounter {
|
|||||||
uint32_t checksum;
|
uint32_t checksum;
|
||||||
};
|
};
|
||||||
|
|
||||||
static char page[2048];
|
|
||||||
|
|
||||||
int mtd_resetbc(const char *mtd)
|
int mtd_resetbc(const char *mtd)
|
||||||
{
|
{
|
||||||
struct mtd_info_user mtd_info;
|
struct mtd_info_user mtd_info;
|
||||||
struct bootcounter *curr = (struct bootcounter *)page;
|
struct bootcounter *curr = NULL;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int bc_offset_increment;
|
unsigned int bc_offset_increment;
|
||||||
int last_count = 0;
|
int last_count = 0;
|
||||||
@ -108,24 +106,23 @@ int mtd_resetbc(const char *mtd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
num_bc = mtd_info.size / bc_offset_increment;
|
num_bc = mtd_info.size / bc_offset_increment;
|
||||||
|
curr = malloc(bc_offset_increment);
|
||||||
|
|
||||||
for (i = 0; i < num_bc; i++) {
|
for (i = 0; i < num_bc; i++) {
|
||||||
pread(fd, curr, sizeof(*curr), i * bc_offset_increment);
|
pread(fd, curr, sizeof(struct bootcounter), i * bc_offset_increment);
|
||||||
|
|
||||||
/* Existing code assumes erase is to 0xff; left as-is (2019) */
|
/* Existing code assumes erase is to 0xff; left as-is (2019) */
|
||||||
|
if (curr->magic == 0xffffffff)
|
||||||
|
break;
|
||||||
|
|
||||||
if (curr->magic != BOOTCOUNT_MAGIC &&
|
if (curr->magic != BOOTCOUNT_MAGIC || curr->checksum != curr->magic + curr->count) {
|
||||||
curr->magic != 0xffffffff) {
|
DLOG_ERR("Unexpected boot-count log at offset %08x: magic %08x boot count %08x checksum %08x; aborting.",
|
||||||
DLOG_ERR("Unexpected magic %08x at offset %08x; aborting.",
|
i * bc_offset_increment, curr->magic, curr->count, curr->checksum);
|
||||||
curr->magic, i * bc_offset_increment);
|
|
||||||
|
|
||||||
retval = -2;
|
retval = -2;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curr->magic == 0xffffffff)
|
|
||||||
break;
|
|
||||||
|
|
||||||
last_count = curr->count;
|
last_count = curr->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,6 +179,7 @@ int mtd_resetbc(const char *mtd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (curr != NULL) free(curr);
|
||||||
close(fd);
|
close(fd);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user