Received: by 2002:ac0:950c:0:0:0:0:0 with SMTP id f12csp2290408imc; Tue, 12 Mar 2019 10:41:38 -0700 (PDT) X-Google-Smtp-Source: APXvYqzvU5JBDAVbct9wmAUAe2K5PGil+07vHH7GxrG2jivSBGgSNZDUJpzaxYUMpFiCX6buqJjt X-Received: by 2002:a63:4826:: with SMTP id v38mr7916470pga.370.1552412498367; Tue, 12 Mar 2019 10:41:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552412498; cv=none; d=google.com; s=arc-20160816; b=lYEbsfi9hx8+NGv9GULqL+FmJbry984GJW4p2R1wCYN43VS5nuZl4EC02ASnPsL/KC FTBzbAAJ0aA/nchYoBZtJT3o/ABXT6bJJs/B1Vod9cIbshfxRQjRhiWk69XQwr6g1cxc MMI9oGJeOYfVRzQhjw+W7ikENJwkLlsFFUrBTC/EhnsknvUdlplLb/w1kdBGmUiDDbC3 K9VrJGX3E7zfZ9bnxbVyTO3AXZKe3GNClON9jMAXMBdqJTx4t7m/T2f+00IzU3hy3GSv 5KNhb8ect8cwVZcaHcdaAyGJqqXI75b/ypStrCfdhVc/xwfnSwKw5BVdSTLB6lyBTj79 ubAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=+JqeXtLRUvXLed8yYnafQ1gKC8EXTD1JgK5pRxadkFs=; b=oDdCMWuP4REquu1Ixvy0DdQjsTbT5UqTDyVgsLviZXnZXoZ0V7Aqsmp0VCSW9i8fmt AzdU/zLW5RKsYynO8d15fIGMMjXOO77PMfWPM7dIZ5TxAmCnHZ5NOQ8ZqVtDJ+golr/3 3VPiSWRSNrFGoxqP71kGJKvwbxJnX59XjxxpqhylEQO2j5N5586K4xHGWu/D+AXNBkNy +x3IErkSSOFYPal4t/3UonMpuRxK9/3s7oLk4/LK/qhDnznmBjb3X6uRxCUIhb8o5zC4 8C+bPuGJ2Vo0hurz3dk04Q+nnDGjiP24kSGfy9PvvGjnd5OcuiTJkc/hUC5TVAcmVNqf 2RiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=kj1ZevBq; 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 16si7959299pga.351.2019.03.12.10.41.22; Tue, 12 Mar 2019 10:41:38 -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; dkim=pass header.i=@kernel.org header.s=default header.b=kj1ZevBq; 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 S1727999AbfCLRjI (ORCPT + 99 others); Tue, 12 Mar 2019 13:39:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:58426 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729125AbfCLRQZ (ORCPT ); Tue, 12 Mar 2019 13:16:25 -0400 Received: from localhost (unknown [104.133.8.98]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3752221741; Tue, 12 Mar 2019 17:16:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1552410984; bh=IuPb2vQiQ9Onbf7WLK5ErPAdK7MEFwsmmB6kTOB4Uyg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kj1ZevBqBcnaDKMeiEQbijYqVOEpCHKOT3CJ85TlHXRC1GrWFODLVTJg0yhBhhTdL rpxQJYipM6h3gCT6qpgxD4sNNvBtLd42nbUB/ZviLNRhILwqgMAlaUnHeEQIHvxRcT eiqm4tQce4Nq9BF4c5AnKDajbdZaA8q8aLOLAOkA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Manish Chopra , Ariel Elior , "David S. Miller" , Sasha Levin Subject: [PATCH 4.14 070/135] qed: Fix system crash in ll2 xmit Date: Tue, 12 Mar 2019 10:08:37 -0700 Message-Id: <20190312170347.737338572@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190312170341.127810985@linuxfoundation.org> References: <20190312170341.127810985@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit 7c81626a3c37e4ac320b8ad785694ba498f24794 ] Cache number of fragments in the skb locally as in case of linear skb (with zero fragments), tx completion (or freeing of skb) may happen before driver tries to get number of frgaments from the skb which could lead to stale access to an already freed skb. Signed-off-by: Manish Chopra Signed-off-by: Ariel Elior Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/qlogic/qed/qed_ll2.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c index cef619f0ce10..e82adea55ce9 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c +++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c @@ -2299,19 +2299,24 @@ static int qed_ll2_start_xmit(struct qed_dev *cdev, struct sk_buff *skb) { struct qed_ll2_tx_pkt_info pkt; const skb_frag_t *frag; + u8 flags = 0, nr_frags; int rc = -EINVAL, i; dma_addr_t mapping; u16 vlan = 0; - u8 flags = 0; if (unlikely(skb->ip_summed != CHECKSUM_NONE)) { DP_INFO(cdev, "Cannot transmit a checksumed packet\n"); return -EINVAL; } - if (1 + skb_shinfo(skb)->nr_frags > CORE_LL2_TX_MAX_BDS_PER_PACKET) { + /* Cache number of fragments from SKB since SKB may be freed by + * the completion routine after calling qed_ll2_prepare_tx_packet() + */ + nr_frags = skb_shinfo(skb)->nr_frags; + + if (1 + nr_frags > CORE_LL2_TX_MAX_BDS_PER_PACKET) { DP_ERR(cdev, "Cannot transmit a packet with %d fragments\n", - 1 + skb_shinfo(skb)->nr_frags); + 1 + nr_frags); return -EINVAL; } @@ -2333,7 +2338,7 @@ static int qed_ll2_start_xmit(struct qed_dev *cdev, struct sk_buff *skb) } memset(&pkt, 0, sizeof(pkt)); - pkt.num_of_bds = 1 + skb_shinfo(skb)->nr_frags; + pkt.num_of_bds = 1 + nr_frags; pkt.vlan = vlan; pkt.bd_flags = flags; pkt.tx_dest = QED_LL2_TX_DEST_NW; @@ -2341,12 +2346,17 @@ static int qed_ll2_start_xmit(struct qed_dev *cdev, struct sk_buff *skb) pkt.first_frag_len = skb->len; pkt.cookie = skb; + /* qed_ll2_prepare_tx_packet() may actually send the packet if + * there are no fragments in the skb and subsequently the completion + * routine may run and free the SKB, so no dereferencing the SKB + * beyond this point unless skb has any fragments. + */ rc = qed_ll2_prepare_tx_packet(&cdev->hwfns[0], cdev->ll2->handle, &pkt, 1); if (rc) goto err; - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + for (i = 0; i < nr_frags; i++) { frag = &skb_shinfo(skb)->frags[i]; mapping = skb_frag_dma_map(&cdev->pdev->dev, frag, 0, -- 2.19.1