Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp425577imu; Wed, 12 Dec 2018 20:33:40 -0800 (PST) X-Google-Smtp-Source: AFSGD/ULWUNh0PcxCFCCHXcemiSyj2Uikdb7MTIUq0JQhUdDdDbch2Vl+uCpuUBKFNnpGbZwO0zP X-Received: by 2002:a17:902:9a98:: with SMTP id w24mr22409636plp.213.1544675620935; Wed, 12 Dec 2018 20:33:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544675620; cv=none; d=google.com; s=arc-20160816; b=rm/HNVJbTd+sycoiiagE9UcXyXkmvA6x+5C/aNnKyzDzrmtXzvv12RRWXMB36ycpZB ITrhV/8rtVsfRgs48285Sj9HJzrJWSB1MBUBrxqCc79JtcxLTuzOlrchV7BnhVN6dz2L 1r5F7XmMW6Y7AUsgjJn3A6AvuEALIQriAd9VTGkAy3CVLBVgHSQT0+4MjblRznwEmZDl cJVL7fGDsGq6gSzlI5tNZcvu3QTsA1iS9F6Y9LzcJn9oyIgEnOkk9UlxZFoSjBgfHyb0 ZachX+Aqr9NSsDdZjRnunyMjLENskHcg+LpKBKGkyDWgtZXyzCTDpO7s3nHl4JjrjsCr KVug== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Zrw4NN6yA5rZWoTWCxml9iFVdHwx664VkUHuv6S30VE=; b=YDAhCiUy1rOKPXaMJpCpI8xCnbqCr2RmaZduTmfPq1bd/6xDUwYRiaRPKZZ8iU5qXv ZvuvW6UFnx2T2ezQQAiBdZqdBV1r7Xpc/kn5sVFn74MoRsZwEYy0JxS8qManPXpBvgkF EYDY8vC1nOenbym/Fmp3C+n7W9B57WzLO6hS9Oi1J7SW1hjjtqT/7NtnHsC1/6Xa8kxA JHPDSRIjNb8Rkr7PUH58lB1mg3bOqLN3hY6CQ2J7skL1wg+opm9+m3aKA8vUEvNlSnWz /FEAHVO6qj0XGd6NoKeA+SRLajOf7eFHJ2ctGtM87ADaWoR3A0GnbAtNpjnAj8uQtNZ0 OR6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BIpNzE+V; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l81si668522pfj.230.2018.12.12.20.33.26; Wed, 12 Dec 2018 20:33:40 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=BIpNzE+V; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728914AbeLMEbx (ORCPT + 99 others); Wed, 12 Dec 2018 23:31:53 -0500 Received: from mail.kernel.org ([198.145.29.99]:44780 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728896AbeLMEbu (ORCPT ); Wed, 12 Dec 2018 23:31:50 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8AA0D20672; Thu, 13 Dec 2018 04:31:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1544675510; bh=V84an21/hUx3qDLbKOg7WJ4D8T2YYXOVhnqg+suWI8c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BIpNzE+VzbWs9OIBWXnANN+c4zty4RPZ/BMN6shZD/cg7c337/eMQFjpiv9sgz+G1 HAfG395hHqsUfw8lcedSbfio9pNm9qv3kxLNaR1ZDNyyA2+gHND+sjpCwyUKfTlKNo LgDK+JFHpfRjkTcM0PHPslkNDSHIvVGJ7hGHZzSU= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Ido Schimmel , "David S . Miller" , Sasha Levin , netdev@vger.kernel.org Subject: [PATCH AUTOSEL 4.14 35/41] mlxsw: spectrum_switchdev: Fix VLAN device deletion via ioctl Date: Wed, 12 Dec 2018 23:30:48 -0500 Message-Id: <20181213043054.75891-35-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181213043054.75891-1-sashal@kernel.org> References: <20181213043054.75891-1-sashal@kernel.org> MIME-Version: 1.0 X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ido Schimmel [ Upstream commit 993107fea5eefdfdfde1ca38d3f01f0bebf76e77 ] When deleting a VLAN device using an ioctl the netdev is unregistered before the VLAN filter is updated via ndo_vlan_rx_kill_vid(). It can lead to a use-after-free in mlxsw in case the VLAN device is deleted while being enslaved to a bridge. The reason for the above is that when mlxsw receives the CHANGEUPPER event, it wrongly assumes that the VLAN device is no longer its upper and thus destroys the internal representation of the bridge port despite the reference count being non-zero. Fix this by checking if the VLAN device is our upper using its real device. In net-next I'm going to remove this trick and instead make mlxsw completely agnostic to the order of the events. Fixes: c57529e1d5d8 ("mlxsw: spectrum: Replace vPorts with Port-VLAN") Signed-off-by: Ido Schimmel Reviewed-by: Petr Machata Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- .../net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c index 32c25772f755..21611613f44c 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c @@ -295,7 +295,13 @@ static bool mlxsw_sp_bridge_port_should_destroy(const struct mlxsw_sp_bridge_port * bridge_port) { - struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_port->dev); + struct net_device *dev = bridge_port->dev; + struct mlxsw_sp *mlxsw_sp; + + if (is_vlan_dev(dev)) + mlxsw_sp = mlxsw_sp_lower_get(vlan_dev_real_dev(dev)); + else + mlxsw_sp = mlxsw_sp_lower_get(dev); /* In case ports were pulled from out of a bridged LAG, then * it's possible the reference count isn't zero, yet the bridge @@ -1646,7 +1652,7 @@ mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device, u16 vid = vlan_dev_vlan_id(bridge_port->dev); mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid); - if (WARN_ON(!mlxsw_sp_port_vlan)) + if (!mlxsw_sp_port_vlan) return; mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan); -- 2.19.1