livepatch: add module locking around kallsyms calls
authorMiroslav Benes <mbenes@suse.cz>
Mon, 1 Jun 2015 15:48:37 +0000 (17:48 +0200)
committerJiri Kosina <jkosina@suse.cz>
Tue, 2 Jun 2015 20:54:38 +0000 (22:54 +0200)
The list of loaded modules is walked through in
module_kallsyms_on_each_symbol (called by kallsyms_on_each_symbol). The
module_mutex lock should be acquired to prevent potential corruptions
in the list.

This was uncovered with new lockdep asserts in module code introduced by
the commit 0be964be0d45 ("module: Sanitize RCU usage and locking") in
recent next- trees.

Signed-off-by: Miroslav Benes <mbenes@suse.cz>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
kernel/livepatch/core.c

index 284e269..9ec5557 100644 (file)
@@ -179,7 +179,9 @@ static int klp_find_object_symbol(const char *objname, const char *name,
                .count = 0
        };
 
+       mutex_lock(&module_mutex);
        kallsyms_on_each_symbol(klp_find_callback, &args);
+       mutex_unlock(&module_mutex);
 
        if (args.count == 0)
                pr_err("symbol '%s' not found in symbol table\n", name);
@@ -219,13 +221,19 @@ static int klp_verify_vmlinux_symbol(const char *name, unsigned long addr)
                .name = name,
                .addr = addr,
        };
+       int ret;
 
-       if (kallsyms_on_each_symbol(klp_verify_callback, &args))
-               return 0;
+       mutex_lock(&module_mutex);
+       ret = kallsyms_on_each_symbol(klp_verify_callback, &args);
+       mutex_unlock(&module_mutex);
 
-       pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
-               name, addr);
-       return -EINVAL;
+       if (!ret) {
+               pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
+                       name, addr);
+               return -EINVAL;
+       }
+
+       return 0;
 }
 
 static int klp_find_verify_func_addr(struct klp_object *obj,