[LEDE-DEV] [PATCH ubox] kmodloader: Check module endian before loading

Florian Fainelli f.fainelli at gmail.com
Fri Jun 30 16:34:22 PDT 2017


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 at gmail.com>
---
 kmodloader.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/kmodloader.c b/kmodloader.c
index 1a63c9810a99..a6aa795a81d4 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);
-- 
2.9.3




More information about the Lede-dev mailing list