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
179179 .count = 0
180180 };
181181
182+ mutex_lock(&module_mutex);
182183 kallsyms_on_each_symbol(klp_find_callback, &args);
184+ mutex_unlock(&module_mutex);
183185
184186 if (args.count == 0)
185187 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
219221 .name = name,
220222 .addr = addr,
221223 };
224+ int ret;
222225
223− if (kallsyms_on_each_symbol(klp_verify_callback, &args))
224− return 0;
226+ mutex_lock(&module_mutex);
227+ ret = kallsyms_on_each_symbol(klp_verify_callback, &args);
228+ mutex_unlock(&module_mutex);
225229
226− pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
227− name, addr);
228− return -EINVAL;
230+ if (!ret) {
231+ pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
232+ name, addr);
233+ return -EINVAL;
234+ }
235+
236+ return 0;
229237 }
230238
231239 static int klp_find_verify_func_addr(struct klp_object *obj,