From patchwork Fri Jun 27 15:19:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Russell King X-Patchwork-Id: 365036 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B45471400DC for ; Sat, 28 Jun 2014 01:23:04 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754517AbaF0PXA (ORCPT ); Fri, 27 Jun 2014 11:23:00 -0400 Received: from gw-1.arm.linux.org.uk ([78.32.30.217]:45214 "EHLO pandora.arm.linux.org.uk" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753446AbaF0PUC (ORCPT ); Fri, 27 Jun 2014 11:20:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=arm.linux.org.uk; s=pandora; h=Date:Sender:Message-Id:Subject:Cc:To:From:References:In-Reply-To; bh=bnjkzO6llWUj62F12jpmZv46n2HWSnrAa4jeX70e66E=; b=RvpXeePvWx0JZgy6VfX+sKeLppSCa9XwBBMppix0/qE9+pbeHymgBZLYq6+/fr1KaNxeRdOtZYEM+4lebWNarFa/eKDf5v7isKvrMZxg2m6AiXyQNFrM7r6alUXGxXaKKOdoO+7e+9/4fBhMS6vhkQXzlF7wd6c8J31K+d8JHkU=; Received: from e0022681537dd.dyn.arm.linux.org.uk ([fd8f:7570:feb6:1:222:68ff:fe15:37dd]:48045 helo=rmk-PC.arm.linux.org.uk) by pandora.arm.linux.org.uk with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.76) (envelope-from ) id 1X0XwW-0004bF-3B; Fri, 27 Jun 2014 16:20:00 +0100 Received: from rmk by rmk-PC.arm.linux.org.uk with local (Exim 4.76) (envelope-from ) id 1X0XwV-0001Ne-O0; Fri, 27 Jun 2014 16:19:59 +0100 In-Reply-To: <20140627151542.GL32514@n2100.arm.linux.org.uk> References: <20140627151542.GL32514@n2100.arm.linux.org.uk> From: Russell King To: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org Cc: Fugang Duan Subject: [PATCH CFT 13/30] net: fec: fix missing kmalloc() failure check in fec_enet_alloc_buffers() Message-Id: Date: Fri, 27 Jun 2014 16:19:59 +0100 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org fec_enet_alloc_buffers() assumes that kmalloc() will never fail, which is an invalid assumption. Fix this by implementing a common error cleanup path, and use it to also clean up after failed bounce buffer allocation. Signed-off-by: Russell King --- drivers/net/ethernet/freescale/fec_main.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 8024b7a8e7f4..5cc9eea6d8b3 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -2101,19 +2101,16 @@ static int fec_enet_alloc_buffers(struct net_device *ndev) dma_addr_t addr; skb = netdev_alloc_skb(ndev, FEC_ENET_RX_FRSIZE); - if (!skb) { - fec_enet_free_buffers(ndev); - return -ENOMEM; - } + if (!skb) + goto err_alloc; addr = dma_map_single(&fep->pdev->dev, skb->data, FEC_ENET_RX_FRSIZE, DMA_FROM_DEVICE); if (dma_mapping_error(&fep->pdev->dev, addr)) { dev_kfree_skb(skb); - fec_enet_free_buffers(ndev); if (net_ratelimit()) netdev_err(ndev, "Rx DMA memory map failed\n"); - return -ENOMEM; + goto err_alloc; } fep->rx_skbuff[i] = skb; @@ -2135,6 +2132,8 @@ static int fec_enet_alloc_buffers(struct net_device *ndev) bdp = fep->tx_bd_base; for (i = 0; i < fep->tx_ring_size; i++) { fep->tx_bounce[i] = kmalloc(FEC_ENET_TX_FRSIZE, GFP_KERNEL); + if (!fep->tx_bounce[i]) + goto err_alloc; bdp->cbd_sc = 0; bdp->cbd_bufaddr = 0; @@ -2152,6 +2151,10 @@ static int fec_enet_alloc_buffers(struct net_device *ndev) bdp->cbd_sc |= BD_SC_WRAP; return 0; + + err_alloc: + fec_enet_free_buffers(ndev); + return -ENOMEM; } static int