[openwrt/openwrt] kernel: mtdsplit: split by WRG header

LEDE Commits lede-commits at lists.infradead.org
Tue Feb 13 02:18:50 PST 2018


blogic pushed a commit to openwrt/openwrt.git, branch master:
https://git.lede-project.org/5c7a58764e55d34317db2cfedb7206c634b4d7f6

commit 5c7a58764e55d34317db2cfedb7206c634b4d7f6
Author: George Hopkins <george-hopkins at null.net>
AuthorDate: Sat Oct 28 14:01:10 2017 +0200

    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 at null.net>
---
 .../files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c      | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c
index c0e8977..16ebd51 100644
--- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c
+++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c
@@ -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;



More information about the lede-commits mailing list