kernel: mtdsplit: split by WRG header
authorGeorge Hopkins <george-hopkins@null.net>
Sat, 28 Oct 2017 12:01:10 +0000 (14:01 +0200)
committerJohn Crispin <john@phrozen.org>
Tue, 13 Feb 2018 10:16:49 +0000 (11:16 +0100)
Support splitting WRG images, which can be found in older
D-Link devices.

Signed-off-by: George Hopkins <george-hopkins@null.net>
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c

index c0e8977..16ebd51 100644 (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;