History

livepatch: add module locking around kallsyms calls

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.

Miroslav Benes committed 11 years ago

Commit 9a1bd631 parent 9497d731 file · +13 −5Browse files

Showing the changes to kernel/livepatch (1 of 1 file). Show all

Unified · Split

kernel/livepatch/core.c+13−5
@@ -179,7 +179,9 @@ static int klp_find_object_symbol(const char *objname, const char *name, · 178 unmodified lines
179 .count = 0179 .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) · 33 unmodified lines
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,