Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754257AbaDVDH4 (ORCPT ); Mon, 21 Apr 2014 23:07:56 -0400 Received: from mail-ob0-f174.google.com ([209.85.214.174]:34041 "EHLO mail-ob0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753425AbaDVDHw (ORCPT ); Mon, 21 Apr 2014 23:07:52 -0400 MIME-Version: 1.0 In-Reply-To: <1397960791-16320-2-git-send-email-davidlohr@hp.com> References: <1397960791-16320-1-git-send-email-davidlohr@hp.com> <1397960791-16320-2-git-send-email-davidlohr@hp.com> Date: Tue, 22 Apr 2014 11:07:51 +0800 Message-ID: Subject: Re: [PATCH 1/6] blackfin/ptrace: call find_vma with the mmap_sem held From: Steven Miao To: Davidlohr Bueso Cc: Andrew Morton , zeus@gnu.org, aswin@hp.com, linux-mm@kvack.org, "open list:CAN NETWORK DRIVERS , open list:NETWORKING DRIVERS , open list" , bfin Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Davidlohr, On Sun, Apr 20, 2014 at 10:26 AM, Davidlohr Bueso wrote: > Performing vma lookups without taking the mm->mmap_sem is asking > for trouble. While doing the search, the vma in question can be > modified or even removed before returning to the caller. Take the > lock (shared) in order to avoid races while iterating through the > vmacache and/or rbtree. Yes, mm->mmap_sem should lock here. Applied, thanks. > > This patch is completely *untested*. > > Signed-off-by: Davidlohr Bueso > Cc: Steven Miao > Cc: adi-buildroot-devel@lists.sourceforge.net > --- > arch/blackfin/kernel/ptrace.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c > index e1f88e0..8b8fe67 100644 > --- a/arch/blackfin/kernel/ptrace.c > +++ b/arch/blackfin/kernel/ptrace.c > @@ -117,6 +117,7 @@ put_reg(struct task_struct *task, unsigned long regno, unsigned long data) > int > is_user_addr_valid(struct task_struct *child, unsigned long start, unsigned long len) > { > + bool valid; > struct vm_area_struct *vma; > struct sram_list_struct *sraml; > > @@ -124,9 +125,12 @@ is_user_addr_valid(struct task_struct *child, unsigned long start, unsigned long > if (start + len < start) > return -EIO; > > + down_read(&child->mm->mmap_sem); > vma = find_vma(child->mm, start); > - if (vma && start >= vma->vm_start && start + len <= vma->vm_end) > - return 0; > + valid = vma && start >= vma->vm_start && start + len <= vma->vm_end; > + up_read(&child->mm->mmap_sem); > + if (valid) > + return 0; > > for (sraml = child->mm->context.sram_list; sraml; sraml = sraml->next) > if (start >= (unsigned long)sraml->addr > -- > 1.8.1.4 > -steven -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/