Skip to content

Commit a50da36

Browse files
kuba-mooPaolo Abeni
authored andcommitted
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: 170aafe ("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>
1 parent 676d53a commit a50da36

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

net/core/netdev-genl-gen.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,16 @@ static const struct genl_multicast_group netdev_nl_mcgrps[] = {
197197
[NETDEV_NLGRP_PAGE_POOL] = { "page-pool", },
198198
};
199199

200+
static void __netdev_nl_sock_priv_init(void *priv)
201+
{
202+
netdev_nl_sock_priv_init(priv);
203+
}
204+
205+
static void __netdev_nl_sock_priv_destroy(void *priv)
206+
{
207+
netdev_nl_sock_priv_destroy(priv);
208+
}
209+
200210
struct genl_family netdev_nl_family __ro_after_init = {
201211
.name = NETDEV_FAMILY_NAME,
202212
.version = NETDEV_FAMILY_VERSION,
@@ -208,6 +218,6 @@ struct genl_family netdev_nl_family __ro_after_init = {
208218
.mcgrps = netdev_nl_mcgrps,
209219
.n_mcgrps = ARRAY_SIZE(netdev_nl_mcgrps),
210220
.sock_priv_size = sizeof(struct list_head),
211-
.sock_priv_init = (void *)netdev_nl_sock_priv_init,
212-
.sock_priv_destroy = (void *)netdev_nl_sock_priv_destroy,
221+
.sock_priv_init = __netdev_nl_sock_priv_init,
222+
.sock_priv_destroy = __netdev_nl_sock_priv_destroy,
213223
};

tools/net/ynl/ynl-gen-c.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,6 +2384,17 @@ def print_kernel_family_struct_src(family, cw):
23842384
if not kernel_can_gen_family_struct(family):
23852385
return
23862386

2387+
if 'sock-priv' in family.kernel_family:
2388+
# Generate "trampolines" to make CFI happy
2389+
cw.write_func("static void", f"__{family.c_name}_nl_sock_priv_init",
2390+
[f"{family.c_name}_nl_sock_priv_init(priv);"],
2391+
["void *priv"])
2392+
cw.nl()
2393+
cw.write_func("static void", f"__{family.c_name}_nl_sock_priv_destroy",
2394+
[f"{family.c_name}_nl_sock_priv_destroy(priv);"],
2395+
["void *priv"])
2396+
cw.nl()
2397+
23872398
cw.block_start(f"struct genl_family {family.ident_name}_nl_family __ro_after_init =")
23882399
cw.p('.name\t\t= ' + family.fam_key + ',')
23892400
cw.p('.version\t= ' + family.ver_key + ',')
@@ -2401,9 +2412,8 @@ def print_kernel_family_struct_src(family, cw):
24012412
cw.p(f'.n_mcgrps\t= ARRAY_SIZE({family.c_name}_nl_mcgrps),')
24022413
if 'sock-priv' in family.kernel_family:
24032414
cw.p(f'.sock_priv_size\t= sizeof({family.kernel_family["sock-priv"]}),')
2404-
# Force cast here, actual helpers take pointer to the real type.
2405-
cw.p(f'.sock_priv_init\t= (void *){family.c_name}_nl_sock_priv_init,')
2406-
cw.p(f'.sock_priv_destroy = (void *){family.c_name}_nl_sock_priv_destroy,')
2415+
cw.p(f'.sock_priv_init\t= __{family.c_name}_nl_sock_priv_init,')
2416+
cw.p(f'.sock_priv_destroy = __{family.c_name}_nl_sock_priv_destroy,')
24072417
cw.block_end(';')
24082418

24092419

0 commit comments

Comments
 (0)