• Oleg Nesterov's avatar
    uprobes: Fix handle_swbp() vs unregister() + register() race · 142b18dd
    Oleg Nesterov authored
    Strictly speaking this race was added by me in 56bb4cf6. However
    I think that this bug is just another indication that we should
    move copy_insn/uprobe_analyze_insn code from install_breakpoint()
    to uprobe_register(), there are a lot of other reasons for that.
    Until then, add a hack to close the race.
    
    A task can hit uprobe U1, but before it calls find_uprobe() this
    uprobe can be unregistered *AND* another uprobe U2 can be added to
    uprobes_tree at the same inode/offset. In this case handle_swbp()
    will use the not-fully-initialized U2, in particular its arch.insn
    for xol.
    
    Add the additional !UPROBE_COPY_INSN check into handle_swbp(),
    if this flag is not set we simply restart as if the new uprobe was
    not inserted yet. This is not very nice, we need barriers, but we
    will remove this hack when we change uprobe_register().
    
    Note: with or without this patch install_breakpoint() can race with
    itself, yet another reson to kill UPROBE_COPY_INSN altogether. And
    even the usage of uprobe->flags is not safe. See the next patches.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    142b18dd
uprobes.c 37.7 KB