Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp2465360imm; Mon, 24 Sep 2018 05:00:15 -0700 (PDT) X-Google-Smtp-Source: ACcGV60wZkGcz0rCcyReMjjaBSWSO2nvd9OIT4Lw6Cd8WMzsySER/5mKCdUMIuCHv8qVv27ZkWZG X-Received: by 2002:a17:902:4503:: with SMTP id m3-v6mr10344554pld.168.1537790415212; Mon, 24 Sep 2018 05:00:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537790415; cv=none; d=google.com; s=arc-20160816; b=YsT2xn1v+B+GiNaNLdTIgAjKSKfQBYH7auklU0bkKLPiit02Fcg0Ay12LW0zlTajsQ +MLGLyZt5NITE6XTmAV2cZicBzgYiYKwStBY3noH+bv+eLOUR9zoOtCpERor8Y4BEDLL mcEkwIHWhEfMewDWgbM9i8h2sq8J1Exam4O9iEppMssLcC5GOVJqRWT1vKh0vNz9bwXL Iz6cTZJWFnLNWKp6OyV3bVHqrFikV1oeFQRvRpxyVSODSJCv2V54ugqiniHqFJTIl5C4 HkfFU2u0+rOYsoK+AxDkP1KvIR1rmwCwa05BYZOGaGkHinzNYArmVBE+DjJGboHmFps1 xyCw== 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; bh=j0liRjlaY+hj8KunTYXQDRidS4BpsmZTl4GAHwFB8vc=; b=pVDJqG7H18lLIdJ3qq9M25Z091nH0VkweAStAufaR/9pduoJTifRc14scRl7mLTzPE hhB5P4tKtWhBfqYTrkd/yQu8ogrOWYwpasGmLNhI/5Q9WuHpOwPCMQrEC9R7TmGDjYGU dwactzbISkqS0qQIbOyuAyLmenbNSUgrp9M/3aMuJK+BP/De5L2n0fpupZk63rIlowBm A3StqBT+lIRk1aey/vZk/fCex/eQZRnKMpwV3mvgD5Q6YrHsh41H0oh8rrblDhMBOT3q 1rVXWRgEgbUwfuI4MLGqoN2vXkh+JkDgY5H275YLr9Le8c08XihIcMDqiyrG2SunEMl3 0x8g== 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 207-v6si977712pgf.245.2018.09.24.05.00.00; Mon, 24 Sep 2018 05:00:15 -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 S1730333AbeIXR7o (ORCPT + 99 others); Mon, 24 Sep 2018 13:59:44 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:52310 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729194AbeIXR7n (ORCPT ); Mon, 24 Sep 2018 13:59:43 -0400 Received: from localhost (ip-213-127-77-73.ip.prioritytelecom.net [213.127.77.73]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id D5E0BD64; Mon, 24 Sep 2018 11:57:57 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, David Rivshin , "David S. Miller" , =?UTF-8?q?SZ=20Lin=20 ?= Subject: [PATCH 4.4 68/70] drivers: net: cpsw: fix segfault in case of bad phy-handle Date: Mon, 24 Sep 2018 13:53:07 +0200 Message-Id: <20180924113107.847362997@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924113058.420454070@linuxfoundation.org> References: <20180924113058.420454070@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review 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.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: David Rivshin commit d733f7542ad47cf73e033c90cf55158587e1d060 upstream. If an emac node has a phy-handle property that points to something which is not a phy, then a segmentation fault will occur when the interface is brought up. This is because while phy_connect() will return ERR_PTR() on failure, of_phy_connect() will return NULL. The common error check uses IS_ERR(), and so missed when of_phy_connect() fails. The NULL pointer is then dereferenced. Also, the common error message referenced slave->data->phy_id, which would be empty in the case of phy-handle. Instead, use the name of the device_node as a useful identifier. And in the phy_id case add the error code for completeness. Fixes: 9e42f715264f ("drivers: net: cpsw: add phy-handle parsing") Signed-off-by: David Rivshin Signed-off-by: David S. Miller [SZ Lin (林上智): Tweak the patch to use original print function of dev_info()] Signed-off-by: SZ Lin (林上智) Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/ti/cpsw.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -1164,25 +1164,34 @@ static void cpsw_slave_open(struct cpsw_ cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, 1 << slave_port, 0, 0, ALE_MCAST_FWD_2); - if (slave->data->phy_node) + if (slave->data->phy_node) { slave->phy = of_phy_connect(priv->ndev, slave->data->phy_node, &cpsw_adjust_link, 0, slave->data->phy_if); - else + if (!slave->phy) { + dev_err(priv->dev, "phy \"%s\" not found on slave %d\n", + slave->data->phy_node->full_name, + slave->slave_num); + return; + } + } else { slave->phy = phy_connect(priv->ndev, slave->data->phy_id, &cpsw_adjust_link, slave->data->phy_if); - if (IS_ERR(slave->phy)) { - dev_err(priv->dev, "phy %s not found on slave %d\n", - slave->data->phy_id, slave->slave_num); - slave->phy = NULL; - } else { - dev_info(priv->dev, "phy found : id is : 0x%x\n", - slave->phy->phy_id); - phy_start(slave->phy); - - /* Configure GMII_SEL register */ - cpsw_phy_sel(&priv->pdev->dev, slave->phy->interface, - slave->slave_num); + if (IS_ERR(slave->phy)) { + dev_err(priv->dev, + "phy \"%s\" not found on slave %d, err %ld\n", + slave->data->phy_id, slave->slave_num, + PTR_ERR(slave->phy)); + slave->phy = NULL; + return; + } } + + dev_info(priv->dev, "phy found : id is : 0x%x\n", slave->phy->phy_id); + + phy_start(slave->phy); + + /* Configure GMII_SEL register */ + cpsw_phy_sel(&priv->pdev->dev, slave->phy->interface, slave->slave_num); } static inline void cpsw_add_default_vlan(struct cpsw_priv *priv)