mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
mlxsw: spectrum_acl_tcam: Fix NULL pointer dereference in error path
commit efeb7dfea8ee10cdec11b6b6ba4e405edbe75809 upstream. When calling mlxsw_sp_acl_tcam_region_destroy() from an error path after failing to attach the region to an ACL group, we hit a NULL pointer dereference upon 'region->group->tcam' [1]. Fix by retrieving the 'tcam' pointer using mlxsw_sp_acl_to_tcam(). [1] BUG: kernel NULL pointer dereference, address: 0000000000000000 [...] RIP: 0010:mlxsw_sp_acl_tcam_region_destroy+0xa0/0xd0 [...] Call Trace: mlxsw_sp_acl_tcam_vchunk_get+0x88b/0xa20 mlxsw_sp_acl_tcam_ventry_add+0x25/0xe0 mlxsw_sp_acl_rule_add+0x47/0x240 mlxsw_sp_flower_replace+0x1a9/0x1d0 tc_setup_cb_add+0xdc/0x1c0 fl_hw_replace_filter+0x146/0x1f0 fl_change+0xc17/0x1360 tc_new_tfilter+0x472/0xb90 rtnetlink_rcv_msg+0x313/0x3b0 netlink_rcv_skb+0x58/0x100 netlink_unicast+0x244/0x390 netlink_sendmsg+0x1e4/0x440 ____sys_sendmsg+0x164/0x260 ___sys_sendmsg+0x9a/0xe0 __sys_sendmsg+0x7a/0xc0 do_syscall_64+0x40/0xe0 entry_SYSCALL_64_after_hwframe+0x63/0x6b Fixes:22a677661f("mlxsw: spectrum: Introduce ACL core with simple TCAM implementation") Signed-off-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Amit Cohen <amcohen@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Petr Machata <petrm@nvidia.com> Acked-by: Paolo Abeni <pabeni@redhat.com> Link: https://lore.kernel.org/r/fb6a4542bbc9fcab5a523802d97059bffbca7126.1705502064.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> [ For the function mlxsw_sp_acl_to_tcam() is not exist in 6.1.y, pick mlxsw_sp_acl_to_tcam() from commit74cbc3c03c] Signed-off-by: Bin Lan <bin.lan.cn@windriver.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c81154a308
commit
75fa2d8b3c
@@ -970,6 +970,7 @@ enum mlxsw_sp_acl_profile {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
|
struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
|
||||||
|
struct mlxsw_sp_acl_tcam *mlxsw_sp_acl_to_tcam(struct mlxsw_sp_acl *acl);
|
||||||
|
|
||||||
int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
|
int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_flow_block *block,
|
struct mlxsw_sp_flow_block *block,
|
||||||
|
|||||||
@@ -40,6 +40,11 @@ struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl)
|
|||||||
return acl->afk;
|
return acl->afk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct mlxsw_sp_acl_tcam *mlxsw_sp_acl_to_tcam(struct mlxsw_sp_acl *acl)
|
||||||
|
{
|
||||||
|
return &acl->tcam;
|
||||||
|
}
|
||||||
|
|
||||||
struct mlxsw_sp_acl_ruleset_ht_key {
|
struct mlxsw_sp_acl_ruleset_ht_key {
|
||||||
struct mlxsw_sp_flow_block *block;
|
struct mlxsw_sp_flow_block *block;
|
||||||
u32 chain_index;
|
u32 chain_index;
|
||||||
|
|||||||
@@ -747,13 +747,13 @@ static void
|
|||||||
mlxsw_sp_acl_tcam_region_destroy(struct mlxsw_sp *mlxsw_sp,
|
mlxsw_sp_acl_tcam_region_destroy(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_acl_tcam_region *region)
|
struct mlxsw_sp_acl_tcam_region *region)
|
||||||
{
|
{
|
||||||
|
struct mlxsw_sp_acl_tcam *tcam = mlxsw_sp_acl_to_tcam(mlxsw_sp->acl);
|
||||||
const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops;
|
const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops;
|
||||||
|
|
||||||
ops->region_fini(mlxsw_sp, region->priv);
|
ops->region_fini(mlxsw_sp, region->priv);
|
||||||
mlxsw_sp_acl_tcam_region_disable(mlxsw_sp, region);
|
mlxsw_sp_acl_tcam_region_disable(mlxsw_sp, region);
|
||||||
mlxsw_sp_acl_tcam_region_free(mlxsw_sp, region);
|
mlxsw_sp_acl_tcam_region_free(mlxsw_sp, region);
|
||||||
mlxsw_sp_acl_tcam_region_id_put(region->group->tcam,
|
mlxsw_sp_acl_tcam_region_id_put(tcam, region->id);
|
||||||
region->id);
|
|
||||||
kfree(region);
|
kfree(region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user