]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mlxsw: fix refcount leak in mlxsw_sp_vrs_lpm_tree_replace()
authorWentao Liang <vulab@iscas.ac.cn>
Tue, 9 Jun 2026 08:47:30 +0000 (08:47 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 11 Jun 2026 22:49:33 +0000 (15:49 -0700)
When mlxsw_sp_vrs_lpm_tree_replace() fails after replacing some VRs,
the error rollback loop does not correctly revert the preceding
replacements. The loop decrements the index but fails to update the
vr pointer, which still points to the VR that caused the failure. As
a result, the condition and the rollback call always operate on the
same VR, potentially calling mlxsw_sp_vr_lpm_tree_replace() multiple
times on it while never rolling back the earlier VRs. Those VRs
continue to hold a reference to new_tree acquired via
mlxsw_sp_lpm_tree_hold(), leaking the reference count of new_tree.

Fix by reinitializing vr inside the error loop with the updated index:

vr = &mlxsw_sp->router->vrs[i];

so that the loop correctly iterates over all VRs that were actually
replaced.

Cc: stable@vger.kernel.org
Fixes: fc922bb0dd94 ("mlxsw: spectrum_router: Use one LPM tree for all virtual routers")
Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20260609084730.215732-1-vulab@iscas.ac.cn
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 7bd87d0547d8af40ca8736e97eac9e3d8a069052..3d6fdbab05e012e1d601b431168e27d13f01a34a 100644 (file)
@@ -1018,6 +1018,7 @@ static int mlxsw_sp_vrs_lpm_tree_replace(struct mlxsw_sp *mlxsw_sp,
 
 err_tree_replace:
        for (i--; i >= 0; i--) {
+               vr = &mlxsw_sp->router->vrs[i];
                if (!mlxsw_sp_vr_lpm_tree_should_replace(vr, proto, new_id))
                        continue;
                mlxsw_sp_vr_lpm_tree_replace(mlxsw_sp,