Skip to content

Commit a22712a

Browse files
Shalom Toledodavem330
authored andcommitted
mlxsw: core: Fix devlink unregister flow
After a failed reload, the driver is still registered to devlink, its devlink instance is still allocated and the 'reload_fail' flag is set. Then, in the next reload try, the driver's allocated devlink instance will be freed without unregistering from devlink and its components (e.g, resources). This scenario can cause a use-after-free if the user tries to execute command via devlink user-space tool. Fix by not freeing the devlink instance during reload (failed or not). Fixes: 24cc68a ("mlxsw: core: Add support for reload") Signed-off-by: Shalom Toledo <shalomt@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ad0b9d9 commit a22712a

File tree

1 file changed

+17
-7
lines changed
  • drivers/net/ethernet/mellanox/mlxsw

1 file changed

+17
-7
lines changed

drivers/net/ethernet/mellanox/mlxsw/core.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -943,8 +943,8 @@ static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink,
943943
mlxsw_core->bus,
944944
mlxsw_core->bus_priv, true,
945945
devlink);
946-
if (err)
947-
mlxsw_core->reload_fail = true;
946+
mlxsw_core->reload_fail = !!err;
947+
948948
return err;
949949
}
950950

@@ -1083,8 +1083,15 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
10831083
{
10841084
struct devlink *devlink = priv_to_devlink(mlxsw_core);
10851085

1086-
if (mlxsw_core->reload_fail)
1087-
goto reload_fail;
1086+
if (mlxsw_core->reload_fail) {
1087+
if (!reload)
1088+
/* Only the parts that were not de-initialized in the
1089+
* failed reload attempt need to be de-initialized.
1090+
*/
1091+
goto reload_fail_deinit;
1092+
else
1093+
return;
1094+
}
10881095

10891096
if (mlxsw_core->driver->fini)
10901097
mlxsw_core->driver->fini(mlxsw_core);
@@ -1098,9 +1105,12 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
10981105
if (!reload)
10991106
devlink_resources_unregister(devlink, NULL);
11001107
mlxsw_core->bus->fini(mlxsw_core->bus_priv);
1101-
if (reload)
1102-
return;
1103-
reload_fail:
1108+
1109+
return;
1110+
1111+
reload_fail_deinit:
1112+
devlink_unregister(devlink);
1113+
devlink_resources_unregister(devlink, NULL);
11041114
devlink_free(devlink);
11051115
}
11061116
EXPORT_SYMBOL(mlxsw_core_bus_device_unregister);

0 commit comments

Comments
 (0)