* Oleg Nesterov <o...@redhat.com> [2012-07-08 22:30:01]: > The bug was introduced by me in 449d0d7c "uprobes: Simplify the > usage of uprobe->pending_list". > > Yes, we do not care about uprobe->pending_list after return and > nobody can remove the current list entry, but put_uprobe(uprobe) > can actually free it and thus we need list_for_each_safe(). > > Reported-by: Srikar Dronamraju <sri...@linux.vnet.ibm.com> > Signed-off-by: Oleg Nesterov <o...@redhat.com>
Acked-by: Srikar Dronamraju <sri...@linux.vnet.ibm.com> > --- > kernel/events/uprobes.c | 8 ++++---- > 1 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c > index 67697db..a93b6df 100644 > --- a/kernel/events/uprobes.c > +++ b/kernel/events/uprobes.c > @@ -1010,7 +1010,7 @@ static void build_probe_list(struct inode *inode, > struct list_head *head) > int uprobe_mmap(struct vm_area_struct *vma) > { > struct list_head tmp_list; > - struct uprobe *uprobe; > + struct uprobe *uprobe, *u; > struct inode *inode; > int ret, count; > > @@ -1028,7 +1028,7 @@ int uprobe_mmap(struct vm_area_struct *vma) > ret = 0; > count = 0; > > - list_for_each_entry(uprobe, &tmp_list, pending_list) { > + list_for_each_entry_safe(uprobe, u, &tmp_list, pending_list) { > if (!ret) { > loff_t vaddr = vma_address(vma, uprobe->offset); > > @@ -1076,7 +1076,7 @@ int uprobe_mmap(struct vm_area_struct *vma) > void uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned > long end) > { > struct list_head tmp_list; > - struct uprobe *uprobe; > + struct uprobe *uprobe, *u; > struct inode *inode; > > if (!atomic_read(&uprobe_events) || !valid_vma(vma, false)) > @@ -1093,7 +1093,7 @@ void uprobe_munmap(struct vm_area_struct *vma, unsigned > long start, unsigned lon > mutex_lock(uprobes_mmap_hash(inode)); > build_probe_list(inode, &tmp_list); > > - list_for_each_entry(uprobe, &tmp_list, pending_list) { > + list_for_each_entry_safe(uprobe, u, &tmp_list, pending_list) { > loff_t vaddr = vma_address(vma, uprobe->offset); > > if (vaddr >= start && vaddr < end) { > -- > 1.5.5.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/