Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp6380561ybi; Mon, 8 Jul 2019 02:10:22 -0700 (PDT) X-Google-Smtp-Source: APXvYqwvtXEHd2NcLdpl3DShLwupcXIdiHEB6ky9Q81+YEAaMrTmRYt7c5dVh+vv7FnycfmEZCl6 X-Received: by 2002:a17:90a:3086:: with SMTP id h6mr24222593pjb.14.1562577022065; Mon, 08 Jul 2019 02:10:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562577022; cv=none; d=google.com; s=arc-20160816; b=DBg3q9spJEjvNCoWUz7wYBmLb2H6N2s5uHlsL8+sPO6YlaXouxycMJLw8aKFFAD9W9 lh0QoBhyx/o0Z5k52tL14nb72H2hng7ZR8tMTOwPvGVj03taO7sJ60bC8KPVN1liB97D u1Y8CAabWQYSh8BtvKr71w6Vtu4/IDElVq33VOCc95GMGIMqSHbpriL1AlhnXDW8h71x Nk25v2Z1hpCZonup+VSOvgXSWOmarE/Yp9c4uPjNVU7yZf91o4hYyPc2GJlNoTwewTEc t6MqrlqsQFuno/4Nm86olubYUQkLpJyaJZ7acwCxpjGz7wX3E+MpY1SWbIexeD/FkAuN BWrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=TGmq/hBr5iw3Dr1OzUbS6QLKReVq+hSW77vupyHJWFQ=; b=NocUMoGdchYz3o/ZCyzrNOIU8fHtuLxsFMTBLNjIeklT2YnHsLSSVIK+5GanJG6dNz 0P1hXXripdIRJBdz5V71Ip9eCRuiGYHH/LjWPasoL4q5UrF1j4yrCURJAEZi2TMxONY+ aRDay3Ny4OSzovdaG1tfYWCBiZ9YUAUPtZMsZsKRl42msxm6eg7OaRqaikkZswOsJOgp CcFUy4ByqQrqlWppEnrwrrkG9hI7QToL8BRzFpLfYWr7vAimmPMVxa2aU5tSxwsPxpMZ 9VAR80G3ITxmFV6DzQ0CLz7px1szjP5511ikJxOtDsctDCM/gHoThqAJ+qTWssnFWTk1 qptA== 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 33si18601156ply.10.2019.07.08.02.10.06; Mon, 08 Jul 2019 02:10:22 -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 S1729066AbfGHGVO (ORCPT + 99 others); Mon, 8 Jul 2019 02:21:14 -0400 Received: from mxhk.zte.com.cn ([63.217.80.70]:65136 "EHLO mxhk.zte.com.cn" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727218AbfGHGVN (ORCPT ); Mon, 8 Jul 2019 02:21:13 -0400 Received: from mse-fl1.zte.com.cn (unknown [10.30.14.238]) by Forcepoint Email with ESMTPS id 2FF41269E9930AADFF56; Mon, 8 Jul 2019 14:21:11 +0800 (CST) Received: from notes_smtp.zte.com.cn ([10.30.1.239]) by mse-fl1.zte.com.cn with ESMTP id x686Kqld015540; Mon, 8 Jul 2019 14:20:52 +0800 (GMT-8) (envelope-from wen.yang99@zte.com.cn) Received: from fox-host8.localdomain ([10.74.120.8]) by szsmtp06.zte.com.cn (Lotus Domino Release 8.5.3FP6) with ESMTP id 2019070814205323-2164429 ; Mon, 8 Jul 2019 14:20:53 +0800 From: Wen Yang To: linux-kernel@vger.kernel.org Cc: xue.zhihong@zte.com.cn, wang.yi59@zte.com.cn, cheng.shengyu@zte.com.cn, Wen Yang , Kishon Vijay Abraham I , Roger Quadros Subject: [PATCH] phy: ti: am654-serdes: fix an use-after-free in serdes_am654_clk_register() Date: Mon, 8 Jul 2019 14:19:05 +0800 Message-Id: <1562566745-7447-4-git-send-email-wen.yang99@zte.com.cn> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1562566745-7447-1-git-send-email-wen.yang99@zte.com.cn> References: <1562566745-7447-1-git-send-email-wen.yang99@zte.com.cn> X-MIMETrack: Itemize by SMTP Server on SZSMTP06/server/zte_ltd(Release 8.5.3FP6|November 21, 2013) at 2019-07-08 14:20:53, Serialize by Router on notes_smtp/zte_ltd(Release 9.0.1FP7|August 17, 2016) at 2019-07-08 14:20:53, Serialize complete at 2019-07-08 14:20:53 X-MAIL: mse-fl1.zte.com.cn x686Kqld015540 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The regmap_node variable is still being used in the syscon_node_to_regmap() call after the of_node_put() call, which may result in use-after-free. Fixes: 71e2f5c5c224 ("phy: ti: Add a new SERDES driver for TI's AM654x SoC") Signed-off-by: Wen Yang Cc: Kishon Vijay Abraham I Cc: Roger Quadros Cc: linux-kernel@vger.kernel.org --- drivers/phy/ti/phy-am654-serdes.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/drivers/phy/ti/phy-am654-serdes.c b/drivers/phy/ti/phy-am654-serdes.c index f8edd08..f14f1f0 100644 --- a/drivers/phy/ti/phy-am654-serdes.c +++ b/drivers/phy/ti/phy-am654-serdes.c @@ -405,6 +405,7 @@ static int serdes_am654_clk_register(struct serdes_am654 *am654_phy, const __be32 *addr; unsigned int reg; struct clk *clk; + int ret = 0; mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL); if (!mux) @@ -413,34 +414,40 @@ static int serdes_am654_clk_register(struct serdes_am654 *am654_phy, init = &mux->clk_data; regmap_node = of_parse_phandle(node, "ti,serdes-clk", 0); - of_node_put(regmap_node); if (!regmap_node) { dev_err(dev, "Fail to get serdes-clk node\n"); - return -ENODEV; + ret = -ENODEV; + goto out_put_node; } regmap = syscon_node_to_regmap(regmap_node->parent); if (IS_ERR(regmap)) { dev_err(dev, "Fail to get Syscon regmap\n"); - return PTR_ERR(regmap); + ret = PTR_ERR(regmap); + goto out_put_node; } num_parents = of_clk_get_parent_count(node); if (num_parents < 2) { dev_err(dev, "SERDES clock must have parents\n"); - return -EINVAL; + ret = -EINVAL; + goto out_put_node; } parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL); - if (!parent_names) - return -ENOMEM; + if (!parent_names) { + ret = -ENOMEM; + goto out_put_node; + } of_clk_parent_fill(node, parent_names, num_parents); addr = of_get_address(regmap_node, 0, NULL, NULL); - if (!addr) - return -EINVAL; + if (!addr) { + ret = -EINVAL; + goto out_put_node; + } reg = be32_to_cpu(*addr); @@ -456,12 +463,16 @@ static int serdes_am654_clk_register(struct serdes_am654 *am654_phy, mux->hw.init = init; clk = devm_clk_register(dev, &mux->hw); - if (IS_ERR(clk)) - return PTR_ERR(clk); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); + goto out_put_node; + } am654_phy->clks[clock_num] = clk; - return 0; +out_put_node: + of_node_put(regmap_node); + return ret; } static const struct of_device_id serdes_am654_id_table[] = { -- 2.9.5