kernel: mtdsplit_uimage: fix Edimax parser
authorMathias Kresin <dev@kresin.me>
Thu, 29 Sep 2016 17:28:13 +0000 (19:28 +0200)
committerMathias Kresin <dev@kresin.me>
Sat, 15 Oct 2016 07:01:45 +0000 (09:01 +0200)
According to the author the code was added to in preparation for adding
support for a new board. The patch for the board was never send and the
code never really tested.

The edimax header starting with the edimax magic is put in front of the
uImage header. There is no special uImage header used. Means, default
magic and the type field is set to kernel as usual.

Signed-off-by: Mathias Kresin <dev@kresin.me>
edimax parser fix

target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c

index 3ddb71bfa7f76ff08a041255351fd1fc135c215a..26cb66ac7f03b11c9bbfd5dd61e9a373053d789e 100644 (file)
@@ -310,27 +310,21 @@ static struct mtd_part_parser uimage_netgear_parser = {
 
 static ssize_t uimage_find_edimax(u_char *buf, size_t len)
 {
-       struct uimage_header *header;
+       u32 *magic;
 
-       if (len < FW_EDIMAX_OFFSET + sizeof(*header)) {
+       if (len < FW_EDIMAX_OFFSET + sizeof(struct uimage_header)) {
                pr_err("Buffer too small for checking Edimax header\n");
                return -ENOSPC;
        }
 
-       header = (struct uimage_header *)(buf + FW_EDIMAX_OFFSET);
-
-       switch be32_to_cpu(header->ih_magic) {
-       case FW_MAGIC_EDIMAX:
-               break;
-       default:
+       magic = (u32 *)buf;
+       if (be32_to_cpu(*magic) != FW_MAGIC_EDIMAX)
                return -EINVAL;
-       }
 
-       if (header->ih_os != IH_OS_LINUX ||
-           header->ih_type != IH_TYPE_FILESYSTEM)
-               return -EINVAL;
+       if (!uimage_verify_default(buf + FW_EDIMAX_OFFSET, len))
+               return FW_EDIMAX_OFFSET;
 
-       return FW_EDIMAX_OFFSET;
+       return -EINVAL;
 }
 
 static int