kmodloader: make insert_module() idempotent
authorYousong Zhou <yszhou4tech@gmail.com>
Fri, 13 Jan 2017 17:00:35 +0000 (01:00 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sun, 15 Jan 2017 17:54:24 +0000 (18:54 +0100)
To fix spurious error messages in the following situation

 1. scan loaded modules
 2. load wireguard.ko and the module itself will request xt_hashlimit to
    be loaded
 3. xt_hashlimit is still in PROBE state here so we also try to load it,
    but init_module() returns EEXIST

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
kmodloader.c

index bcb213b36757ead6ad21b8bd94a21483e5d9b457..729027a6d0675afa69b4dfc3d169fce91a7639f0 100644 (file)
@@ -574,8 +574,11 @@ static int insert_module(char *path, const char *options)
        }
 
        data = malloc(s.st_size);
-       if (read(fd, data, s.st_size) == s.st_size)
+       if (read(fd, data, s.st_size) == s.st_size) {
                ret = syscall(__NR_init_module, data, (unsigned long) s.st_size, options);
+               if (errno == EEXIST)
+                       ret = 0;
+       }
        else
                ULOG_ERR("failed to read full module %s\n", path);