aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,