kernel: mtdsplit: split by WRG header

Support splitting WRG images, which can be found in older
D-Link devices.

Signed-off-by: George Hopkins <george-hopkins@null.net>
This commit is contained in:
George Hopkins 2017-10-28 14:01:10 +02:00 committed by John Crispin
parent 6e7357097f
commit 5c7a58764e

View File

@ -22,6 +22,7 @@
#define WRGG_NR_PARTS 2
#define WRGG_MIN_ROOTFS_OFFS 0x80000 /* 512KiB */
#define WRGG03_MAGIC 0x20080321
#define WRG_MAGIC 0x20040220
struct wrgg03_header {
char signature[32];
@ -38,6 +39,16 @@ struct wrgg03_header {
char digest[16];
} __attribute__ ((packed));
struct wrg_header {
char signature[32];
uint32_t magic1;
uint32_t magic2;
uint32_t size;
uint32_t offset;
char devname[32];
char digest[16];
} __attribute__ ((packed));
static int mtdsplit_parse_wrgg(struct mtd_info *master,
const struct mtd_partition **pparts,
@ -59,10 +70,14 @@ static int mtdsplit_parse_wrgg(struct mtd_info *master,
return -EIO;
/* sanity checks */
if (le32_to_cpu(hdr.magic1) != WRGG03_MAGIC)
if (le32_to_cpu(hdr.magic1) == WRGG03_MAGIC) {
kernel_ent_size = hdr_len + be32_to_cpu(hdr.size);
} else if (le32_to_cpu(hdr.magic1) == WRG_MAGIC) {
kernel_ent_size = sizeof(struct wrg_header) + le32_to_cpu(
((struct wrg_header*)&hdr)->size);
} else {
return -EINVAL;
kernel_ent_size = hdr_len + be32_to_cpu(hdr.size);
}
if (kernel_ent_size > master->size)
return -EINVAL;