]> git.itanic.dy.fi Git - linux-stable/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)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 16 Jun 2023 19:59:20 +0000 (12:59 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c

index 57e22c5170df68bf7194883bb853782e4bea529b..0f783e7906cb5357685543ad0db50541eaa6166f 100644 (file)
@@ -1421,9 +1421,13 @@ dr_action_create_reformat_action(struct mlx5dr_domain *dmn,
        }
        case DR_ACTION_TYP_TNL_L3_TO_L2:
        {
-               u8 hw_actions[DR_ACTION_CACHE_LINE_SIZE] = {};
+               u8 *hw_actions;
                int ret;
 
+               hw_actions = kzalloc(DR_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,
@@ -1431,6 +1435,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;
                }
 
@@ -1440,6 +1445,7 @@ dr_action_create_reformat_action(struct mlx5dr_domain *dmn,
                ret = mlx5dr_ste_alloc_modify_hdr(action);
                if (ret) {
                        mlx5dr_dbg(dmn, "Failed preparing reformat data\n");
+                       kfree(hw_actions);
                        return ret;
                }
                return 0;