]> www.infradead.org Git - users/hch/misc.git/commitdiff
net/mlx5: fix unintentional sign extension on shift of dest_attr->vport.vhca_id
authorColin Ian King <colin.i.king@gmail.com>
Thu, 16 Jan 2025 18:17:00 +0000 (18:17 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 18 Jan 2025 03:52:34 +0000 (19:52 -0800)
Shifting dest_attr->vport.vhca_id << 16 results in a promotion from an
unsigned 16 bit integer to a 32 bit signed integer, this is then sign
extended to a 64 bit unsigned long on 64 bitarchitectures. If vhca_id is
greater than 0x7fff then this leads to a sign extended result where all
the upper 32 bits of idx are set to 1. Fix this by casting vhca_id
to the same type as idx before performing the shift.

Fixes: 8e2e08a6d1e0 ("net/mlx5: fs, add support for dest vport HWS action")
Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Acked-by: Moshe Shemesh <moshe@nvidia.com>
Link: https://patch.msgid.link/20250116181700.96437-1-colin.i.king@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c

index 05329afeb9ea2b8b50f55acfcdf14487dea3b47e..f34bbbbba1c2a0068a3be7c346d3920be364dc3d 100644 (file)
@@ -417,7 +417,7 @@ mlx5_fs_get_dest_action_vport(struct mlx5_fs_hws_context *fs_ctx,
        vport_num = is_dest_type_uplink ? MLX5_VPORT_UPLINK : dest_attr->vport.num;
        if (vhca_id_valid) {
                dests_xa = &fs_ctx->hws_pool.vport_vhca_dests;
-               idx = dest_attr->vport.vhca_id << 16 | vport_num;
+               idx = (unsigned long)dest_attr->vport.vhca_id << 16 | vport_num;
        } else {
                dests_xa = &fs_ctx->hws_pool.vport_dests;
                idx = vport_num;