mirror of https://github.com/hak5/openwrt-owl.git
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>openwrt-18.06
parent
6e7357097f
commit
5c7a58764e
|
@ -22,6 +22,7 @@
|
||||||
#define WRGG_NR_PARTS 2
|
#define WRGG_NR_PARTS 2
|
||||||
#define WRGG_MIN_ROOTFS_OFFS 0x80000 /* 512KiB */
|
#define WRGG_MIN_ROOTFS_OFFS 0x80000 /* 512KiB */
|
||||||
#define WRGG03_MAGIC 0x20080321
|
#define WRGG03_MAGIC 0x20080321
|
||||||
|
#define WRG_MAGIC 0x20040220
|
||||||
|
|
||||||
struct wrgg03_header {
|
struct wrgg03_header {
|
||||||
char signature[32];
|
char signature[32];
|
||||||
|
@ -38,6 +39,16 @@ struct wrgg03_header {
|
||||||
char digest[16];
|
char digest[16];
|
||||||
} __attribute__ ((packed));
|
} __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,
|
static int mtdsplit_parse_wrgg(struct mtd_info *master,
|
||||||
const struct mtd_partition **pparts,
|
const struct mtd_partition **pparts,
|
||||||
|
@ -59,10 +70,14 @@ static int mtdsplit_parse_wrgg(struct mtd_info *master,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
/* sanity checks */
|
/* 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;
|
return -EINVAL;
|
||||||
|
}
|
||||||
kernel_ent_size = hdr_len + be32_to_cpu(hdr.size);
|
|
||||||
|
|
||||||
if (kernel_ent_size > master->size)
|
if (kernel_ent_size > master->size)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
Loading…
Reference in New Issue