Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp566821imu; Thu, 20 Dec 2018 01:29:57 -0800 (PST) X-Google-Smtp-Source: AFSGD/WpEjAVl59lGGOxBescSnwp36+VpYMVv46K1FJPaqurUBYtux2bpA3UZJBipEVGBZdNaFqt X-Received: by 2002:a63:da45:: with SMTP id l5mr22618613pgj.111.1545298197204; Thu, 20 Dec 2018 01:29:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545298197; cv=none; d=google.com; s=arc-20160816; b=JdOCJaafHul4y/XgAkOy6fYliIZpUy4ybDET6/RvHnKVAvG9TwX7EQ9VVO1UgGP2WE evcOB6ANg4zOz8HcK/W0snd2ggNS42znRKo4k36g0FUqvZM5t4FkPF+WDkNHOGmu3ayu zE+dIy+dLlLMZs5uoxpAsnh8xq3uA5Ye6KWQCpXdpZkg8rrc566YL7olYLMoPLgzz/8b y2ofBQD36NS9nEjmWIkDs9Cq0ngVJa3mwwOx5lvg9nd3rZWBCFMRPi29fHVH8xq/53uk e2ikEWBp0D3QoZDkoccZVjzm6ji703FMB6HVicUn1cVT9GkIRwzATHtgiST8c6aUSb4q lVSQ== 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:dkim-signature; bh=b62SFro4t9A6hwPqxNIpvOD8AutpmTCYaaDneTxKA3s=; b=EK63vAaAMF7WBTknYn+IBsFPV1L2ygpdJAMPAwpcyXhwJ/N5+7eQ6wBf2dFWc3xq5R dpHPHa5noX2gm4OwzLNNu/p8rdl0sJz+982OL3Z0D0DxATF8DqQaFrwZ0Z/sys1DO5uF LVIgPG43kZACnxMExFLm8EQOYF7TweKaN1MKf6bOoQ1lWc72Q06FMOLRucOxbSoo5Kcq xAoBn3DhFK8ugXF9KFF/k8lZnFSuXbFmOxg1zxTrhk1SxGWuHrBLLNa/2TbcgN4NWv82 zQwmqybaZqNtx+UkhV8c5N7uFTY7td4SIAPcTNxgE3LWrJ4h0SDzsJgIwcGo0uf7pZ5x 83/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=T5tDJUMA; 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 n78si18477515pfi.235.2018.12.20.01.29.41; Thu, 20 Dec 2018 01:29:57 -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=T5tDJUMA; 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 S1732442AbeLTJ2I (ORCPT + 99 others); Thu, 20 Dec 2018 04:28:08 -0500 Received: from mail.kernel.org ([198.145.29.99]:43250 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732428AbeLTJ2G (ORCPT ); Thu, 20 Dec 2018 04:28:06 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C207E20656; Thu, 20 Dec 2018 09:28:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1545298086; bh=rbnvEGlL0bX0MrC8PfUBCus5vtEGOW7Yz+rIvV5Ib7Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T5tDJUMAFVzr/Q7Inr263GNJclYwx1XzqmFcfZdlCOxUKJjoOf4wBYJoeXsqCziey /Y9g2f+HdWSblvKG1Nhc4zwM+QZWUUloQELFVo4ED9AcBj1mlhUx4HPK/xwd2gNhKY zIkugZqSt+n2QMOFo8yVrxGPKnG3/OzMYJcEuThc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ido Schimmel , Petr Machata , "David S. Miller" , Sasha Levin Subject: [PATCH 4.14 65/72] mlxsw: spectrum_switchdev: Fix VLAN device deletion via ioctl Date: Thu, 20 Dec 2018 10:19:04 +0100 Message-Id: <20181220085924.892486001@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20181220085922.332225035@linuxfoundation.org> References: <20181220085922.332225035@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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.14-stable review patch. If anyone has any objections, please let me know. ------------------ [ 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