aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiroslav Benes <mbenes@suse.cz>2015-06-01 11:48:37 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-07-21 13:10:04 -0400
commit9da8e034daa3670221442392ce9ea17474591c34 (patch)
treee39a8632c273fe1b499b25033c03405eb80eee38
parentc17210c30c65355713afb618da1e24b970fa69c8 (diff)
livepatch: add module locking around kallsyms calls
commit 9a1bd63cdae4b623494c4ebaf723a91c35ec49fb upstream. 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> Signed-off-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--kernel/livepatch/core.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 284e2691e380..9ec555732f1a 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -179,7 +179,9 @@ static int klp_find_object_symbol(const char *objname, const char *name,
179 .count = 0 179 .count = 0
180 }; 180 };
181 181
182 mutex_lock(&module_mutex);
182 kallsyms_on_each_symbol(klp_find_callback, &args); 183 kallsyms_on_each_symbol(klp_find_callback, &args);
184 mutex_unlock(&module_mutex);
183 185
184 if (args.count == 0) 186 if (args.count == 0)
185 pr_err("symbol '%s' not found in symbol table\n", name); 187 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)
219 .name = name, 221 .name = name,
220 .addr = addr, 222 .addr = addr,
221 }; 223 };
224 int ret;
222 225
223 if (kallsyms_on_each_symbol(klp_verify_callback, &args)) 226 mutex_lock(&module_mutex);
224 return 0; 227 ret = kallsyms_on_each_symbol(klp_verify_callback, &args);
228 mutex_unlock(&module_mutex);
225 229
226 pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n", 230 if (!ret) {
227 name, addr); 231 pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
228 return -EINVAL; 232 name, addr);
233 return -EINVAL;
234 }
235
236 return 0;
229} 237}
230 238
231static int klp_find_verify_func_addr(struct klp_object *obj, 239static int klp_find_verify_func_addr(struct klp_object *obj,