projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
c4ce0da
)
livepatch: fix RCU usage in klp_find_external_symbol()
author
Peter Zijlstra
<
[email protected]
>
Sat, 28 Feb 2015 21:24:48 +0000
(22:24 +0100)
committer
Jiri Kosina
<
[email protected]
>
Mon, 2 Mar 2015 23:22:55 +0000
(
00:22
+0100)
While one must hold RCU-sched (aka. preempt_disable) for find_symbol()
one must equally hold it over the use of the object returned.
The moment you release the RCU-sched read lock, the object can be dead
and gone.
[
[email protected]
: change subject line to be aligned with other patches]
Cc: Seth Jennings <
[email protected]
>
Cc: Josh Poimboeuf <
[email protected]
>
Cc: Masami Hiramatsu <
[email protected]
>
Cc: Miroslav Benes <
[email protected]
>
Cc: Petr Mladek <
[email protected]
>
Cc: Jiri Kosina <
[email protected]
>
Cc: "Paul E. McKenney" <
[email protected]
>
Cc: Rusty Russell <
[email protected]
>
Signed-off-by: Peter Zijlstra (Intel) <
[email protected]
>
Reviewed-by: Masami Hiramatsu <
[email protected]
>
Acked-by: Paul E. McKenney <
[email protected]
>
Acked-by: Josh Poimboeuf <
[email protected]
>
Signed-off-by: Jiri Kosina <
[email protected]
>
kernel/livepatch/core.c
patch
|
blob
|
history
diff --git
a/kernel/livepatch/core.c
b/kernel/livepatch/core.c
index 782172f073c5ed4bde5318bf96777ee79c618b89..01ca08804f5115a298cb89940e9da6ac804d00c3 100644
(file)
--- a/
kernel/livepatch/core.c
+++ b/
kernel/livepatch/core.c
@@
-248,11
+248,12
@@
static int klp_find_external_symbol(struct module *pmod, const char *name,
/* first, check if it's an exported symbol */
preempt_disable();
sym = find_symbol(name, NULL, NULL, true, true);
- preempt_enable();
if (sym) {
*addr = sym->value;
+ preempt_enable();
return 0;
}
+ preempt_enable();
/* otherwise check if it's in another .o within the patch module */
return klp_find_object_symbol(pmod->name, name, addr);