mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-04-13 09:59:31 +00:00
netdev: avoid CFI problems with sock priv helpers
Li Li reports that casting away callback type may cause issues
for CFI. Let's generate a small wrapper for each callback,
to make sure compiler sees the anticipated types.
Reported-by: Li Li <dualli@chromium.org>
Link: https://lore.kernel.org/CANBPYPjQVqmzZ4J=rVQX87a9iuwmaetULwbK_5_3YWk2eGzkaA@mail.gmail.com
Fixes: 170aafe35c
("netdev: support binding dma-buf to netdevice")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250115161436.648646-1-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
676d53a480
commit
a50da36562
2 changed files with 25 additions and 5 deletions
|
@ -197,6 +197,16 @@ static const struct genl_multicast_group netdev_nl_mcgrps[] = {
|
||||||
[NETDEV_NLGRP_PAGE_POOL] = { "page-pool", },
|
[NETDEV_NLGRP_PAGE_POOL] = { "page-pool", },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __netdev_nl_sock_priv_init(void *priv)
|
||||||
|
{
|
||||||
|
netdev_nl_sock_priv_init(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __netdev_nl_sock_priv_destroy(void *priv)
|
||||||
|
{
|
||||||
|
netdev_nl_sock_priv_destroy(priv);
|
||||||
|
}
|
||||||
|
|
||||||
struct genl_family netdev_nl_family __ro_after_init = {
|
struct genl_family netdev_nl_family __ro_after_init = {
|
||||||
.name = NETDEV_FAMILY_NAME,
|
.name = NETDEV_FAMILY_NAME,
|
||||||
.version = NETDEV_FAMILY_VERSION,
|
.version = NETDEV_FAMILY_VERSION,
|
||||||
|
@ -208,6 +218,6 @@ struct genl_family netdev_nl_family __ro_after_init = {
|
||||||
.mcgrps = netdev_nl_mcgrps,
|
.mcgrps = netdev_nl_mcgrps,
|
||||||
.n_mcgrps = ARRAY_SIZE(netdev_nl_mcgrps),
|
.n_mcgrps = ARRAY_SIZE(netdev_nl_mcgrps),
|
||||||
.sock_priv_size = sizeof(struct list_head),
|
.sock_priv_size = sizeof(struct list_head),
|
||||||
.sock_priv_init = (void *)netdev_nl_sock_priv_init,
|
.sock_priv_init = __netdev_nl_sock_priv_init,
|
||||||
.sock_priv_destroy = (void *)netdev_nl_sock_priv_destroy,
|
.sock_priv_destroy = __netdev_nl_sock_priv_destroy,
|
||||||
};
|
};
|
||||||
|
|
|
@ -2384,6 +2384,17 @@ def print_kernel_family_struct_src(family, cw):
|
||||||
if not kernel_can_gen_family_struct(family):
|
if not kernel_can_gen_family_struct(family):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if 'sock-priv' in family.kernel_family:
|
||||||
|
# Generate "trampolines" to make CFI happy
|
||||||
|
cw.write_func("static void", f"__{family.c_name}_nl_sock_priv_init",
|
||||||
|
[f"{family.c_name}_nl_sock_priv_init(priv);"],
|
||||||
|
["void *priv"])
|
||||||
|
cw.nl()
|
||||||
|
cw.write_func("static void", f"__{family.c_name}_nl_sock_priv_destroy",
|
||||||
|
[f"{family.c_name}_nl_sock_priv_destroy(priv);"],
|
||||||
|
["void *priv"])
|
||||||
|
cw.nl()
|
||||||
|
|
||||||
cw.block_start(f"struct genl_family {family.ident_name}_nl_family __ro_after_init =")
|
cw.block_start(f"struct genl_family {family.ident_name}_nl_family __ro_after_init =")
|
||||||
cw.p('.name\t\t= ' + family.fam_key + ',')
|
cw.p('.name\t\t= ' + family.fam_key + ',')
|
||||||
cw.p('.version\t= ' + family.ver_key + ',')
|
cw.p('.version\t= ' + family.ver_key + ',')
|
||||||
|
@ -2401,9 +2412,8 @@ def print_kernel_family_struct_src(family, cw):
|
||||||
cw.p(f'.n_mcgrps\t= ARRAY_SIZE({family.c_name}_nl_mcgrps),')
|
cw.p(f'.n_mcgrps\t= ARRAY_SIZE({family.c_name}_nl_mcgrps),')
|
||||||
if 'sock-priv' in family.kernel_family:
|
if 'sock-priv' in family.kernel_family:
|
||||||
cw.p(f'.sock_priv_size\t= sizeof({family.kernel_family["sock-priv"]}),')
|
cw.p(f'.sock_priv_size\t= sizeof({family.kernel_family["sock-priv"]}),')
|
||||||
# Force cast here, actual helpers take pointer to the real type.
|
cw.p(f'.sock_priv_init\t= __{family.c_name}_nl_sock_priv_init,')
|
||||||
cw.p(f'.sock_priv_init\t= (void *){family.c_name}_nl_sock_priv_init,')
|
cw.p(f'.sock_priv_destroy = __{family.c_name}_nl_sock_priv_destroy,')
|
||||||
cw.p(f'.sock_priv_destroy = (void *){family.c_name}_nl_sock_priv_destroy,')
|
|
||||||
cw.block_end(';')
|
cw.block_end(';')
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue