kmodloader: fix not being able to find some modules
authorNathan Hintz <nlhintz@hotmail.com>
Tue, 21 Feb 2017 05:14:24 +0000 (05:14 +0000)
committerFelix Fietkau <nbd@nbd.name>
Tue, 21 Feb 2017 13:07:38 +0000 (14:07 +0100)
kmodloader is using slightly different criteria for ordering the AVL tree
versus what it uses to traverse it.  This sometimes results in not being
able to find some modules.

Reference: https://bugs.lede-project.org/index.php?do=details&task_id=443

Signed-off-by: Nathan Hintz <nlhintz@hotmail.com>
kmodloader.c

index 465d3de84206337d7f18799c93d7e3a15ba90090..ac14bacaa0916fffcbee415d5ef8743cda6d772c 100644 (file)
@@ -985,20 +985,23 @@ out:
        return 0;
 }
 
+static inline char weight(char c)
+{
+       return c == '_' ? '-' : c;
+}
+
 static int avl_modcmp(const void *k1, const void *k2, void *ptr)
 {
        const char *s1 = k1;
        const char *s2 = k2;
 
-       while (*s1 && ((*s1 == *s2) ||
-                      ((*s1 == '_') && (*s2 == '-')) ||
-                      ((*s1 == '-') && (*s2 == '_'))))
+       while (*s1 && (weight(*s1) == weight(*s2)))
        {
                s1++;
                s2++;
        }
 
-       return *(const unsigned char *)s1 - *(const unsigned char *)s2;
+       return (unsigned char)weight(*s1) - (unsigned char)weight(*s2);
 }
 
 int main(int argc, char **argv)