Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp435031imu; Wed, 12 Dec 2018 20:49:42 -0800 (PST) X-Google-Smtp-Source: AFSGD/VVeQ+f/YDBun9bWg1iyVBmEVwDuya2hetFZmNpJP62+nvHkY8kYvl/d7/bb64Sgj2uV9+6 X-Received: by 2002:a63:ce08:: with SMTP id y8mr20387000pgf.388.1544676582919; Wed, 12 Dec 2018 20:49:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544676582; cv=none; d=google.com; s=arc-20160816; b=vTp08MGScADPd3BfwxoDNA4tThvvtWAZAynSlxk5s+bOXLv9IqxjCV6798hkIvv6GC 4LttaY+w+6Rm/cRO7378i7VDHDIiWZzFIjTOkENbjz46H0e8tIL5UR2K31bicgwHgHJl jlMvjJIIAHdfKxJdLQcoY0Y4eVbOdmjDCr0V0inZUyBkuAqKtecGV9ERlAjInQosdcjW EPiZ4loC2zwexc9HGAR8SLoye5bDiBVQUervciP88He3zgVQovuq9nrKpUwdVcQZOaWa eLOx8KvF5CjXsdh44JuW3DsRj1O9/BpWlZ7VbAX6R+w1w2s73ltdN6A6owvR6hFAUVzO XD6Q== 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=G54K0i4ITj7r6Q4z2vX6R6EFPbJRgtu5HnPUv8PP7ac=; b=ErE5i1y5ADr+Fk3/ihIU0S9zMejxx2u+Ef/xaQcIPbhCu9M5fZqFLkYcw/jaZeGYWD Piy4j1o3E2+NgHNp3pdKNksq+YWou+wrwjruWOgjEPHwzoTCkF+0cA49qwtvlv/jsVoI ykg9nkqvx7htuRirT8zRa5jQL9d4xnGAzJ85MKdHsfoh2S4d1NunjZ6Wa1jYIvxp6JkA +nRybGpvmC164+IUz73CyvwFbYw8kogu0sIAsfNwqr2V4oswGXOGqDwf0a80goPif8Cg B6EgYAzlZKV+FFV6E97aN17FXcUZwYPcJJFTkaby2tTrWxdE5/E7qJrh9WeXP/VKsgvk rWOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=t0ZL25z0; 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 r197si776359pfc.116.2018.12.12.20.49.05; Wed, 12 Dec 2018 20:49:42 -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=t0ZL25z0; 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 S1729141AbeLMEqU (ORCPT + 99 others); Wed, 12 Dec 2018 23:46:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:43542 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728377AbeLMEal (ORCPT ); Wed, 12 Dec 2018 23:30:41 -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 6A66920672; Thu, 13 Dec 2018 04:30:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1544675441; bh=eBzBnCItfae7bxtJKkziekdzsbbCs4KqrtdFXkmBMLU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t0ZL25z0sQpALJjLvaEDXmPXDK8KDZoRe2yChApC0uxLWZrJrR/PS1jwEoowy9mds b4rEKRkfIL4xn2RT0AKfsoP6xQnQIXgBr6BdKEqy1mGzXbUYrtYiKNuB6gg3rcZ+8F glNGLqnemSo93EF2RHZp3t7JZP6GN7S9+mprfHlw= 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.19 65/73] mlxsw: spectrum_switchdev: Fix VLAN device deletion via ioctl Date: Wed, 12 Dec 2018 23:28:30 -0500 Message-Id: <20181213042838.75160-65-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181213042838.75160-1-sashal@kernel.org> References: <20181213042838.75160-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 7715f1ed2bcb..4eb64cb0d9a1 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c @@ -286,7 +286,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 @@ -2020,7 +2026,7 @@ mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device, vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : 1; 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