• Oleg Nesterov's avatar
    uprobes/x86: Teach arch_uprobe_post_xol() to restart if possible · 75f9ef0b
    Oleg Nesterov authored
    SIGILL after the failed arch_uprobe_post_xol() should only be used as
    a last resort, we should try to restart the probed insn if possible.
    
    Currently only adjust_ret_addr() can fail, and this can only happen if
    another thread unmapped our stack after we executed "call" out-of-line.
    Most probably the application if buggy, but even in this case it can
    have a handler for SIGSEGV/etc. And in theory it can be even correct
    and do something non-trivial with its memory.
    
    Of course we can't restart unconditionally, so arch_uprobe_post_xol()
    does this only if ->post_xol() returns -ERESTART even if currently this
    is the only possible error.
    
    default_post_xol_op(UPROBE_FIX_CALL) can always restart, but as Jim
    pointed out it should not forget to pop off the return address pushed
    by this insn executed out-of-line.
    
    Note: this is not "perfect", we do not want the extra handler_chain()
    after restart, but I think this is the best solution we can realistically
    do without too much uglifications.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Reviewed-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Reviewed-by: default avatarJim Keniston <jkenisto@us.ibm.com>
    75f9ef0b
uprobes.c 23.2 KB