Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp334609imd; Wed, 31 Oct 2018 20:25:18 -0700 (PDT) X-Google-Smtp-Source: AJdET5fPjyCAjw7QtJFG9CwQZPh7G3rGmc4WPyt7wHvx2sqjJ3a6gleKcvWSVpC+EvXtKmffwn5/ X-Received: by 2002:a17:902:2867:: with SMTP id e94-v6mr6016571plb.317.1541042718545; Wed, 31 Oct 2018 20:25:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541042718; cv=none; d=google.com; s=arc-20160816; b=X7BfdG80WEgqLvUmH+FB1jRwKnfi/rGsEqAYi67rKd/rj51ZQOJd60WqD9FUwEgvNw eJUIVKOOLYD2jLmSuh8pXAjpokCtU7/T8Bz6p1UakF8hw4Ysfr0PovIBzW/vWu7zdfbc OrosbfMRARkLV+6C8LCWLo+gZcBs8ukto8XpFroPrqdHYav5gQX8oVRwrnVUm8mRdI0C m1UEa5Jg0kjutMpxYfWG5W5w2PgKOcKF5hFyUxVsl19UQSMGLDhdcc2snta21PWCyZwA /0Nqnc2ojlOxbqMdjm4v4OUtbjt5TP2emYE2pjCg6O/qRLQGOzcbCiU1Zn+qUpDFpXv2 2ukg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=O17JKxs0bQ8v2NR4ueT3kt77FlVgzc/v9/LcoarXi9g=; b=f52vhiABM6JPmjnWcOEm8dqG5qsK1f05Q/oLZF44ZQ5W7NfxQ1+aLZpggHga23yGVx GN5jMA6xd/aClSbq+tyHKh3xWs9NGVdGCxJVindfOhVx/lfaCUHvw+AY1CiPetolcL0u ne9QVS2d03Ia8Nw3INQqSZv3VxsMLEZABgeRwidPBU3OYdAnb8UMpFGKeKPe56qmHdtF PU/nwSRwQ2P3MvsYb9ZY+NTAPlC9o3FG2g4tg61ZIuBq6VozHOfLP7ZQgMFuW+ayp2yP DgXJTW7WBIzcMUZJgPBJ6CXHE0tqnPXrhjCyO85j1VNBBTGkTDMzyMoyKDIwzZTBBaC5 xVTQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h184-v6si31753874pfb.146.2018.10.31.20.25.03; Wed, 31 Oct 2018 20:25:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727693AbeKAMZE (ORCPT + 99 others); Thu, 1 Nov 2018 08:25:04 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42670 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726327AbeKAMZE (ORCPT ); Thu, 1 Nov 2018 08:25:04 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 570E73001E49; Thu, 1 Nov 2018 03:24:00 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-128.nay.redhat.com [10.66.14.128]) by smtp.corp.redhat.com (Postfix) with ESMTP id 958FF5D6A6; Thu, 1 Nov 2018 03:23:55 +0000 (UTC) From: Peter Xu To: linux-kernel@vger.kernel.org Cc: peterx@redhat.com, Vineet Gupta , "Eric W. Biederman" , Andrew Morton , Souptick Joarder , Andrea Arcangeli , linux-snps-arc@lists.infradead.org Subject: [PATCH RFC] mm: arc: fix potential double realease of mmap_sem Date: Thu, 1 Nov 2018 11:23:54 +0800 Message-Id: <20181101032354.19351-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Thu, 01 Nov 2018 03:24:00 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In do_page_fault() of ARC we have: ... fault = handle_mm_fault(vma, address, flags); /* If Pagefault was interrupted by SIGKILL, exit page fault "early" */ if (unlikely(fatal_signal_pending(current))) { if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY)) up_read(&mm->mmap_sem); <---------------- [1] if (user_mode(regs)) return; } ... if (likely(!(fault & VM_FAULT_ERROR))) { ... return; } if (fault & VM_FAULT_OOM) goto out_of_memory; <----------------- [2] else if (fault & VM_FAULT_SIGSEGV) goto bad_area; <----------------- [3] else if (fault & VM_FAULT_SIGBUS) goto do_sigbus; <----------------- [4] Logically it's possible that we might try to release the mmap_sem twice by having a scenario like: - task received SIGKILL, - task handled kernel mode page fault, - handle_mm_fault() returned with one of VM_FAULT_ERROR, Then we'll go into path [1] to release the mmap_sem, however we won't return immediately since user_mode(regs) check will fail (a kernel page fault). Then we might go into either [2]-[4] and either of them will try to release the mmap_sem again. To fix this, we only release the mmap_sem at [1] when we're sure we'll quit immediately (after we checked with user_mode(regs)). CC: Vineet Gupta CC: "Eric W. Biederman" CC: Peter Xu CC: Andrew Morton CC: Souptick Joarder CC: Andrea Arcangeli CC: linux-snps-arc@lists.infradead.org CC: linux-kernel@vger.kernel.org Signed-off-by: Peter Xu --- I noticed this only by reading the code. Neither have I verified the issue, nor have I tested the patch since I even don't know how to (I'm totally unfamiliar with the arc architecture). However I'm posting this out first to see whether there's any quick feedback, and in case it's a valid issue that we've ignored. --- arch/arc/mm/fault.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index c9da6102eb4f..2d28c3dad5c1 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c @@ -142,11 +142,10 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) fault = handle_mm_fault(vma, address, flags); /* If Pagefault was interrupted by SIGKILL, exit page fault "early" */ - if (unlikely(fatal_signal_pending(current))) { - if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY)) + if (unlikely(fatal_signal_pending(current) && user_mode(regs))) { + if (!(fault & VM_FAULT_RETRY)) up_read(&mm->mmap_sem); - if (user_mode(regs)) - return; + return; } perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); -- 2.17.1