• O
    uprobes: Use percpu_rw_semaphore to fix register/unregister vs dup_mmap() race · 32cdba1e
    Oleg Nesterov 提交于
    This was always racy, but 26872090
    "uprobes: Rework register_for_each_vma() to make it O(n)" should be
    blamed anyway, it made everything worse and I didn't notice.
    
    register/unregister call build_map_info() and then do install/remove
    breakpoint for every mm which mmaps inode/offset. This can obviously
    race with fork()->dup_mmap() in between and we can miss the child.
    
    uprobe_register() could be easily fixed but unregister is much worse,
    the new mm inherits "int3" from parent and there is no way to detect
    this if uprobe goes away.
    
    So this patch simply adds percpu_down_read/up_read around dup_mmap(),
    and percpu_down_write/up_write into register_for_each_vma().
    
    This adds 2 new hooks into dup_mmap() but we can kill uprobe_dup_mmap()
    and fold it into uprobe_end_dup_mmap().
    Reported-by: NSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    Acked-by: NSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    Signed-off-by: NOleg Nesterov <oleg@redhat.com>
    32cdba1e
uprobes.c 38.9 KB