Received: by 10.213.65.68 with SMTP id h4csp273041imn; Fri, 23 Mar 2018 04:27:37 -0700 (PDT) X-Google-Smtp-Source: AG47ELvWSgC/t7lEdH3D4PjXfYnuGrbBGOl6fX45QhP3y2kflkRm0gx6Yey6Fm10PkFWW9Jf/ayb X-Received: by 10.99.120.138 with SMTP id t132mr20914133pgc.280.1521804457212; Fri, 23 Mar 2018 04:27:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521804457; cv=none; d=google.com; s=arc-20160816; b=K81MEMizH7Vi3Xf3/MdXZk/ugEESs/LKbiIK7Phjm5Nt9bpArj02ZREOK0eqAJ95+o L7/UEY+jeid/6qa6yvTuVyWmiYADrMgIpGjliK0Fx4GPGoHxOf+Qhptie+Ku+MTjclRU ycMVCP3ZtkUts6ywJ/QQsI67bOHupSTa+fNeSVFeoifyW7e2CYVu/zNpF5ipGD+2WAnG Kf0AFO9MdZmEgN4EdrAcDDFPjiAsMUTZIn5GxaLVtVJ9TCx/LLRfSiky2ZPfTEsetpC5 WZom0W/RhjkFE1wELI6sfaU6cjoO/RUU5VZv1YjaNnW4bliEZVqRNYkBFm+vK+VTn5uZ Yx9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=E11eB6qTOqc+oJ2rHDDJnOwtwKjaW3eckG8zI7pE4zk=; b=UNBLFvxJNkpvrntLNZLd42a4XFjdMug9TRdNT9FNQP9XVLympjyQuQMfPB0699QlC5 CE2wldnfRpa+9iZW2VCqk0uT9vFOgIQxV6kZ9FggzPYBbHf/gGr8DV9f3fhT/Oj+RSt5 bATJbF4fMNoYc5Qwslo2gslsejEel4A7PCB+yUDyx69D+4GO9RYf7s3uiTy137vbKPff Vvl3jMvYg3of/GKfrSQq+y74TRL/gx/M5wIxDTz72sqZmUtos9xXpGuy5gCU2KMPHE5I 9xMW/svk/vLuo09okLnEqCbKOnrQIeICLCTZsYIaHt2xWFbO71EwkE1FZjSbK+yMRQvx c53g== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s4-v6si8124643plq.178.2018.03.23.04.27.22; Fri, 23 Mar 2018 04:27:37 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932413AbeCWKHQ (ORCPT + 99 others); Fri, 23 Mar 2018 06:07:16 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:41094 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932345AbeCWKHG (ORCPT ); Fri, 23 Mar 2018 06:07:06 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 2134FD09; Fri, 23 Mar 2018 10:07:05 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Sasha Levin Subject: [PATCH 4.9 069/177] pNFS: Fix use after free issues in pnfs_do_read() Date: Fri, 23 Mar 2018 10:53:17 +0100 Message-Id: <20180323094208.373666529@linuxfoundation.org> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180323094205.090519271@linuxfoundation.org> References: <20180323094205.090519271@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Trond Myklebust [ Upstream commit 6aeafd05eca9bc8ab6b03d7e56d09ffd18190f44 ] The assumption should be that if the caller returns PNFS_ATTEMPTED, then hdr has been consumed, and so we should not be testing hdr->task.tk_status. If the caller returns PNFS_TRY_AGAIN, then we need to recoalesce and free hdr. Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- fs/nfs/pnfs.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -2308,10 +2308,20 @@ pnfs_do_read(struct nfs_pageio_descripto enum pnfs_try_status trypnfs; trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg); - if (trypnfs == PNFS_TRY_AGAIN) - pnfs_read_resend_pnfs(hdr); - if (trypnfs == PNFS_NOT_ATTEMPTED || hdr->task.tk_status) + switch (trypnfs) { + case PNFS_NOT_ATTEMPTED: pnfs_read_through_mds(desc, hdr); + case PNFS_ATTEMPTED: + break; + case PNFS_TRY_AGAIN: + /* cleanup hdr and prepare to redo pnfs */ + if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) { + struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); + list_splice_init(&hdr->pages, &mirror->pg_list); + mirror->pg_recoalesce = 1; + } + hdr->mds_ops->rpc_release(hdr); + } } static void pnfs_readhdr_free(struct nfs_pgio_header *hdr)