kmodloader: Check module endian before loading
authorFlorian Fainelli <f.fainelli@gmail.com>
Fri, 30 Jun 2017 23:34:22 +0000 (16:34 -0700)
committerFlorian Fainelli <f.fainelli@gmail.com>
Sun, 2 Jul 2017 19:25:21 +0000 (12:25 -0700)
If we manage to accidentally get a module installed that does not match
the system endianess (there is currently nothing preventing that in
OpenWrt/LEDE) we will hit a segmentation fault when doing this:

sh = (Elf32_Shdr *) (map + e->e_shoff);

because e->e_shoff will be wrongly encoded and this most likely will
result in an invalid offset to de-reference from.

Update elf_find_section() to check that the build time endianess of
kmodloader matches that of the module, otherwise nothing would work
really.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
kmodloader.c

index 1a63c9810a99e30009ef9a85c39dba6a65fb3264..a6aa795a81d495d37911ea16d41c7c211dc231af 100644 (file)
@@ -214,6 +214,19 @@ static int elf32_find_section(char *map, const char *section, unsigned int *offs
 static int elf_find_section(char *map, const char *section, unsigned int *offset, unsigned int *size)
 {
        int clazz = map[EI_CLASS];
+       int endian = map[EI_DATA];
+
+#if defined(__LITTLE_ENDIAN)
+       if (endian != ELFDATA2LSB)
+#elif defined(__BIG_ENDIAN)
+       if (endian != ELFDATA2MSB)
+#else
+#error "unsupported endian"
+#endif
+       {
+               ULOG_ERR("invalid endianess: %d\n", endian);
+               return -1;
+       }
 
        if (clazz == ELFCLASS32)
                return elf32_find_section(map, section, offset, size);