Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751392AbdH1Nqt (ORCPT ); Mon, 28 Aug 2017 09:46:49 -0400 Received: from mx2.suse.de ([195.135.220.15]:58048 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751234AbdH1Nqr (ORCPT ); Mon, 28 Aug 2017 09:46:47 -0400 Date: Mon, 28 Aug 2017 15:46:45 +0200 From: Michal Hocko To: Nadav Amit Cc: Nadia Yvette Chambers , linux-kernel@vger.kernel.org, Nadav Amit , Eric Biggers , Mike Kravetz , Andrew Morton Subject: Re: [PATCH] hugetlbfs: change put_page/unlock_page order in hugetlbfs_fallocate() Message-ID: <20170828134645.GA17080@dhcp22.suse.cz> References: <20170826210905.GA21712@zzz.localdomain> <20170826191124.51642-1-namit@vmware.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170826191124.51642-1-namit@vmware.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2012 Lines: 59 [CC Andrew] On Sat 26-08-17 12:11:24, Nadav Amit wrote: > hugetlfs_fallocate() currently performs put_page() before unlock_page(). > This scenario opens a small time window, from the time the page is added > to the page cache, until it is unlocked, in which the page might be > removed from the page-cache by another core. If the page is removed > during this time windows, it might cause a memory corruption, as the > wrong page will be unlocked. > > It is arguable whether this scenario can happen in a real system, and > there are several mitigating factors. The issue was found by code > inspection (actually grep), and not by actually triggering the flow. > Yet, since putting the page before unlocking is incorrect it should be > fixed, if only to prevent future breakage or someone copy-pasting this > code. Even if this a theoretical problem it is definitely worth fixing because it is a anti-pattern of how the reference counted object should be treated. > Fixes: 70c3547e36f5c ("hugetlbfs: add hugetlbfs_fallocate()") > > cc: Eric Biggers > cc: Mike Kravetz > > Signed-off-by: Nadav Amit Acked-by: Michal Hocko Thanks! > --- > fs/hugetlbfs/inode.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c > index 28d2753be094..9475fee79cee 100644 > --- a/fs/hugetlbfs/inode.c > +++ b/fs/hugetlbfs/inode.c > @@ -655,11 +655,11 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset, > mutex_unlock(&hugetlb_fault_mutex_table[hash]); > > /* > - * page_put due to reference from alloc_huge_page() > * unlock_page because locked by add_to_page_cache() > + * page_put due to reference from alloc_huge_page() > */ > - put_page(page); > unlock_page(page); > + put_page(page); > } > > if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > inode->i_size) > -- > 2.11.0 -- Michal Hocko SUSE Labs