Message ID | 20220629070205.803952-1-idosch@nvidia.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 665030fd0c1ed9f505932e6e73e7a2c788787a0a |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] mlxsw: spectrum_router: Fix rollback in tunnel next hop init | expand |
Hello: This patch was applied to netdev/net.git (master) by Paolo Abeni <pabeni@redhat.com>: On Wed, 29 Jun 2022 10:02:05 +0300 you wrote: > From: Petr Machata <petrm@nvidia.com> > > In mlxsw_sp_nexthop6_init(), a next hop is always added to the router > linked list, and mlxsw_sp_nexthop_type_init() is invoked afterwards. When > that function results in an error, the next hop will not have been removed > from the linked list. As the error is propagated upwards and the caller > frees the next hop object, the linked list ends up holding an invalid > object. > > [...] Here is the summary with links: - [net] mlxsw: spectrum_router: Fix rollback in tunnel next hop init https://git.kernel.org/netdev/net/c/665030fd0c1e You are awesome, thank you!
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 0b103fc68a1a..63652460c40d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -4323,6 +4323,8 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp, return 0; err_nexthop_neigh_init: + list_del(&nh->router_list_node); + mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); mlxsw_sp_nexthop_remove(mlxsw_sp, nh); return err; } @@ -6498,6 +6500,7 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp, const struct fib6_info *rt) { struct net_device *dev = rt->fib6_nh->fib_nh_dev; + int err; nh->nhgi = nh_grp->nhgi; nh->nh_weight = rt->fib6_nh->fib_nh_weight; @@ -6513,7 +6516,16 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp, return 0; nh->ifindex = dev->ifindex; - return mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); + err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); + if (err) + goto err_nexthop_type_init; + + return 0; + +err_nexthop_type_init: + list_del(&nh->router_list_node); + mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); + return err; } static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp,