]> Git Repo - linux.git/commitdiff
livepatch: fix RCU usage in klp_find_external_symbol()
authorPeter Zijlstra <[email protected]>
Sat, 28 Feb 2015 21:24:48 +0000 (22:24 +0100)
committerJiri 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

index 782172f073c5ed4bde5318bf96777ee79c618b89..01ca08804f5115a298cb89940e9da6ac804d00c3 100644 (file)
@@ -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);
This page took 0.051689 seconds and 4 git commands to generate.