net/mlx5e: Fix overrun reported by coverity
authorJianbo Liu <jianbol@nvidia.com>
Tue, 14 Nov 2023 01:25:21 +0000 (01:25 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Jan 2024 12:42:28 +0000 (12:42 +0000)
[ Upstream commit da75fa542873e5f7d7f615566c0b00042d8a0437 ]

Coverity Scan reports the following issue. But it's impossible that
mlx5_get_dev_index returns 7 for PF, even if the index is calculated
from PCI FUNC ID. So add the checking to make coverity slience.

CID 610894 (#2 of 2): Out-of-bounds write (OVERRUN)
Overrunning array esw->fdb_table.offloads.peer_miss_rules of 4 8-byte
elements at element index 7 (byte offset 63) using index
mlx5_get_dev_index(peer_dev) (which evaluates to 7).

Fixes: 9bee385a6e39 ("net/mlx5: E-switch, refactor FDB miss rule add/remove")
Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index bb8bcb4..9bd5609 100644 (file)
@@ -1177,9 +1177,9 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
        struct mlx5_flow_handle *flow;
        struct mlx5_flow_spec *spec;
        struct mlx5_vport *vport;
+       int err, pfindex;
        unsigned long i;
        void *misc;
-       int err;
 
        if (!MLX5_VPORT_MANAGER(esw->dev) && !mlx5_core_is_ecpf_esw_manager(esw->dev))
                return 0;
@@ -1255,7 +1255,15 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
                        flows[vport->index] = flow;
                }
        }
-       esw->fdb_table.offloads.peer_miss_rules[mlx5_get_dev_index(peer_dev)] = flows;
+
+       pfindex = mlx5_get_dev_index(peer_dev);
+       if (pfindex >= MLX5_MAX_PORTS) {
+               esw_warn(esw->dev, "Peer dev index(%d) is over the max num defined(%d)\n",
+                        pfindex, MLX5_MAX_PORTS);
+               err = -EINVAL;
+               goto add_ec_vf_flow_err;
+       }
+       esw->fdb_table.offloads.peer_miss_rules[pfindex] = flows;
 
        kvfree(spec);
        return 0;