]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: DR, Fix wrong action data allocation in decap action
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Sun, 4 Jun 2023 18:07:04 +0000 (21:07 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Jun 2023 09:14:12 +0000 (11:14 +0200)
[ Upstream commit ef4c5afc783dc3d47640270a9b94713229c697e8 ]

When TUNNEL_L3_TO_L2 decap action was created, a pointer to a local
variable was passed as its HW action data, resulting in attempt to
free invalid address:

  BUG: KASAN: invalid-free in mlx5dr_action_destroy+0x318/0x410 [mlx5_core]

Fixes: 4781df92f4da ("net/mlx5: DR, Move STEv0 modify header logic")
Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c

index ee104cf04392f8ad99d9a2c7dda6b61d70a929a8..438c3bfae762ae2dd15440ab0ad7e955c9b41320 100644 (file)
@@ -1403,9 +1403,13 @@ dr_action_create_reformat_action(struct mlx5dr_domain *dmn,
        }
        case DR_ACTION_TYP_TNL_L3_TO_L2:
        {
-               u8 hw_actions[ACTION_CACHE_LINE_SIZE] = {};
+               u8 *hw_actions;
                int ret;
 
+               hw_actions = kzalloc(ACTION_CACHE_LINE_SIZE, GFP_KERNEL);
+               if (!hw_actions)
+                       return -ENOMEM;
+
                ret = mlx5dr_ste_set_action_decap_l3_list(dmn->ste_ctx,
                                                          data, data_sz,
                                                          hw_actions,
@@ -1413,6 +1417,7 @@ dr_action_create_reformat_action(struct mlx5dr_domain *dmn,
                                                          &action->rewrite->num_of_actions);
                if (ret) {
                        mlx5dr_dbg(dmn, "Failed creating decap l3 action list\n");
+                       kfree(hw_actions);
                        return ret;
                }
 
@@ -1420,6 +1425,7 @@ dr_action_create_reformat_action(struct mlx5dr_domain *dmn,
                                                                DR_CHUNK_SIZE_8);
                if (!action->rewrite->chunk) {
                        mlx5dr_dbg(dmn, "Failed allocating modify header chunk\n");
+                       kfree(hw_actions);
                        return -ENOMEM;
                }
 
@@ -1433,6 +1439,7 @@ dr_action_create_reformat_action(struct mlx5dr_domain *dmn,
                if (ret) {
                        mlx5dr_dbg(dmn, "Writing decap l3 actions to ICM failed\n");
                        mlx5dr_icm_free_chunk(action->rewrite->chunk);
+                       kfree(hw_actions);
                        return ret;
                }
                return 0;