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:
		
				
					committed by
					
						
						John Crispin
					
				
			
			
				
	
			
			
			
						parent
						
							6e7357097f
						
					
				
				
					commit
					5c7a58764e
				
			@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user