From patchwork Sun Dec 8 08:38:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: George Spelvin X-Patchwork-Id: 1205599 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=sdf.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47W0FY2jwJz9sPJ for ; Sun, 8 Dec 2019 19:42:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726044AbfLHIm3 (ORCPT ); Sun, 8 Dec 2019 03:42:29 -0500 Received: from mx.sdf.org ([205.166.94.20]:61901 "EHLO mx.sdf.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725815AbfLHIm3 (ORCPT ); Sun, 8 Dec 2019 03:42:29 -0500 X-Greylist: delayed 417 seconds by postgrey-1.27 at vger.kernel.org; Sun, 08 Dec 2019 03:42:29 EST Received: from sdf.org (IDENT:lkml@sdf.lonestar.org [205.166.94.16]) by mx.sdf.org (8.15.2/8.14.5) with ESMTPS id xB88cS5H025057 (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits) verified NO); Sun, 8 Dec 2019 08:38:28 GMT Received: (from lkml@localhost) by sdf.org (8.15.2/8.12.8/Submit) id xB88cSTa015147; Sun, 8 Dec 2019 08:38:28 GMT Date: Sun, 8 Dec 2019 08:38:28 GMT From: George Spelvin Message-Id: <201912080838.xB88cSTa015147@sdf.org> To: michael.chan@broadcom.com, netdev@vger.kernel.org Subject: [RFC PATCH 3/4] b44: Unmap DMA ring buffers before kfree Cc: hauke@hauke-m.de, lkml@sdf.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org It's an unlikely error path during initialization, but let's not leak DMA mappings. Also the condition for an unacceptable mapping is corrected from dma_addr + len > 0x3fffffff to dma_addr + len > 0x40000000, as in the previous patch. Signed-off-by: George Spelvin --- drivers/net/ethernet/broadcom/b44.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c index e540d5646aef..90e25a1f284f 100644 --- a/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c @@ -1226,8 +1226,12 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp) DMA_TABLE_BYTES, DMA_BIDIRECTIONAL); - if (dma_mapping_error(bp->sdev->dma_dev, rx_ring_dma) || - rx_ring_dma + size > DMA_BIT_MASK(30)) { + if (dma_mapping_error(bp->sdev->dma_dev, rx_ring_dma)) + goto rx_failed; + if (rx_ring_dma + size > DMA_BIT_MASK(30)+1) { + dma_unmap_single(bp->sdev->dma_dev, rx_ring_dma, + DMA_TABLE_BYTES, DMA_BIDIRECTIONAL); +rx_failed: kfree(rx_ring); goto out_err; } @@ -1254,8 +1258,12 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp) DMA_TABLE_BYTES, DMA_TO_DEVICE); - if (dma_mapping_error(bp->sdev->dma_dev, tx_ring_dma) || - tx_ring_dma + size > DMA_BIT_MASK(30)) { + if (dma_mapping_error(bp->sdev->dma_dev, tx_ring_dma)) + goto tx_failed; + if (tx_ring_dma + size > DMA_BIT_MASK(30)+1) { + dma_unmap_single(bp->sdev->dma_dev, tx_ring_dma, + DMA_TABLE_BYTES, DMA_TO_DEVICE); +tx_failed: kfree(tx_ring); goto out_err; }