From: Florian Fainelli Date: Fri, 30 Jun 2017 23:34:22 +0000 (-0700) Subject: kmodloader: Check module endian before loading X-Git-Url: http://git.openwrt.org/?p=project%2Fubox.git;a=commitdiff_plain;h=2cff779140b7b10256d722c9267f8a38c9fba088 kmodloader: Check module endian before loading 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 --- diff --git a/kmodloader.c b/kmodloader.c index 1a63c98..a6aa795 100644 --- a/kmodloader.c +++ b/kmodloader.c @@ -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);