Skip to content

Commit 9a1bd63

Browse files
mirabJiri Kosina
authored andcommitted
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 0be964b ("module: Sanitize RCU usage and locking") in recent next- trees. Signed-off-by: Miroslav Benes <[email protected]> Acked-by: Josh Poimboeuf <[email protected]> Cc: [email protected] Signed-off-by: Jiri Kosina <[email protected]>
1 parent 9497d73 commit 9a1bd63

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

kernel/livepatch/core.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,9 @@ static int klp_find_object_symbol(const char *objname, const char *name,
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)
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,

0 commit comments

Comments
 (0)