summaryrefslogtreecommitdiff
path: root/arch/ia64
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2012-11-14 19:03:42 +0100
committerOleg Nesterov <oleg@redhat.com>2012-11-16 14:52:51 +0100
commit32cdba1e05418909708a17e52505e8b2ba4381d1 (patch)
tree63ab2edf02cbf72e71f4ba3d6c751eaf956d4e91 /arch/ia64
parent65b6ecc03838fd263cf7fafdfa6cf13012b91d56 (diff)
downloadlinux-3.10-32cdba1e05418909708a17e52505e8b2ba4381d1.tar.gz
linux-3.10-32cdba1e05418909708a17e52505e8b2ba4381d1.tar.bz2
linux-3.10-32cdba1e05418909708a17e52505e8b2ba4381d1.zip
uprobes: Use percpu_rw_semaphore to fix register/unregister vs dup_mmap() race
This was always racy, but 268720903f87e0b84b161626c4447b81671b5d18 "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: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Diffstat (limited to 'arch/ia64')
0 files changed, 0 insertions, 0 deletions