From patchwork Wed Nov 30 14:29:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 701034 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 3tTNF1288Zz9tB1 for ; Thu, 1 Dec 2016 01:33:09 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hsHiTK3T"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758027AbcK3Ocs (ORCPT ); Wed, 30 Nov 2016 09:32:48 -0500 Received: from mail-lf0-f67.google.com ([209.85.215.67]:33950 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757362AbcK3Oce (ORCPT ); Wed, 30 Nov 2016 09:32:34 -0500 Received: by mail-lf0-f67.google.com with SMTP id o141so16056016lff.1; Wed, 30 Nov 2016 06:32:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Qy7FrRuZV8mMbvgqIK1BY9y6XI4aDZHPh/o33uQPbXM=; b=hsHiTK3Tn1tAKamxmYW+MmChS4Y1BriHSTay6WJnZieE6Ahenhjx5OSqz5K0U5Qot9 S2Iq0ZBXo0S56KO/SYJcw9Bq6PyS1A1J6T8ZFTawn4U4TDy7quFe7yE0K6+/c6Wc7woZ y+y8O31afQsuObkhNhmh9B7qzB/QVVvXrK9hNJtc06IGL2V2UkqF+DuH/9NAaL0VBhg4 0FDg69kjupxVQ69cJUp/zfiSknkYtc26oyutFotGx8SV3tqI01ctOehnobu3BdYrxy75 IBMKkBcuGTCieB6Ckjb1/lOIUwzY1AjCbGRwa5YR/KznHm94R8mv38i7i3Hh+1bY85zZ F4PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Qy7FrRuZV8mMbvgqIK1BY9y6XI4aDZHPh/o33uQPbXM=; b=PCdMOv2YFWalvPu/beRimGE3+lrliBepSdRH426h7ZoGKTmdK0XunbxRmLefKJkrzA KXNg6vnAFeC5dFx6SuJBp2Ir/4MG+K1K/yXCeZCo7Uvqcgc4YilvMWgOZxsZ5/9g2PF0 UJxFM62OtONW2DTNIU1DTiqWSuL7Ax9sG3pkLLzjcOzN0EyHV4ZKhtfT6O8nQHb/5rPN 5dC5o6tXu+4zAq6ZR7P66B07gSHJVVhNBVZQXylBEVxUZhI+U1titZoOw9zuz7U11ik5 5pa6DIG3n/68MW9V121oxpeBh6vG00T8ihr+0m5Pi5RPP1Ey9OTSlfQQRAgkd5Tl/lc7 4/sQ== X-Gm-Message-State: AKaTC03Q2zHQzaZR3rOEieor5YGwj5O882rjgzgRwhIyaDr5Gd2d/RLE4KkCoBJyFbKSwQ== X-Received: by 10.25.202.6 with SMTP id a6mr12901112lfg.30.1480516352429; Wed, 30 Nov 2016 06:32:32 -0800 (PST) Received: from xi.terra (c-04aadb54.07-184-6d6c6d4.cust.bredbandsbolaget.se. [84.219.170.4]) by smtp.gmail.com with ESMTPSA id v72sm5686224lfa.11.2016.11.30.06.32.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Nov 2016 06:32:31 -0800 (PST) Received: from johan by xi.terra with local (Exim 4.87) (envelope-from ) id 1cC5vw-0007E5-C4; Wed, 30 Nov 2016 15:32:28 +0100 From: Johan Hovold To: "David S. Miller" Cc: Giuseppe Cavallaro , Alexandre Torgue , Joachim Eastwood , Carlo Caione , Kevin Hilman , Maxime Coquelin , Maxime Ripard , Chen-Yu Tsai , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold Subject: [PATCH net 1/7] net: ethernet: stmmac: dwmac-socfpga: fix use-after-free on probe errors Date: Wed, 30 Nov 2016 15:29:49 +0100 Message-Id: <1480516195-27696-2-git-send-email-johan@kernel.org> X-Mailer: git-send-email 2.7.3 In-Reply-To: <1480516195-27696-1-git-send-email-johan@kernel.org> References: <1480516195-27696-1-git-send-email-johan@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Make sure to call stmmac_dvr_remove() before returning on late probe errors so that memory is freed, clocks are disabled, and the netdev is deregistered before its resources go away. Fixes: 3c201b5a84ed ("net: stmmac: socfpga: Remove re-registration of reset controller") Signed-off-by: Johan Hovold --- .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 29 ++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c index bec6963ac71e..47db157da3e8 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c @@ -304,6 +304,8 @@ static int socfpga_dwmac_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; int ret; struct socfpga_dwmac *dwmac; + struct net_device *ndev; + struct stmmac_priv *stpriv; ret = stmmac_get_platform_resources(pdev, &stmmac_res); if (ret) @@ -327,19 +329,26 @@ static int socfpga_dwmac_probe(struct platform_device *pdev) plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed; ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); + if (ret) + return ret; - if (!ret) { - struct net_device *ndev = platform_get_drvdata(pdev); - struct stmmac_priv *stpriv = netdev_priv(ndev); + ndev = platform_get_drvdata(pdev); + stpriv = netdev_priv(ndev); - /* The socfpga driver needs to control the stmmac reset to - * set the phy mode. Create a copy of the core reset handel - * so it can be used by the driver later. - */ - dwmac->stmmac_rst = stpriv->stmmac_rst; + /* The socfpga driver needs to control the stmmac reset to set the phy + * mode. Create a copy of the core reset handle so it can be used by + * the driver later. + */ + dwmac->stmmac_rst = stpriv->stmmac_rst; - ret = socfpga_dwmac_set_phy_mode(dwmac); - } + ret = socfpga_dwmac_set_phy_mode(dwmac); + if (ret) + goto err_dvr_remove; + + return 0; + +err_dvr_remove: + stmmac_dvr_remove(&pdev->dev); return ret; }