On 17/12/24 08:55, Alexander Lobakin wrote:
From: Kees Cook <[email protected]>
Date: Mon, 16 Dec 2024 18:59:55 -0800

This switches to using a manually constructed form of struct tagging
to avoid issues with C++ being unable to parse tagged structs within
anonymous unions, even under 'extern "C"':

   ../linux/include/uapi/linux/pkt_cls.h:25124: error: ‘struct 
tc_u32_sel::<unnamed union>::tc_u32_sel_hdr,’ invalid; an anonymous union may 
only have public non-static data members [-fpermissive]

I worked around that like this in the past: [0]
As I'm not sure it would be fine to fix every such occurrence manually
by open-coding.
What do you think?

The thing is that, in this particular case, we need a struct tag to change
the type of an object in another struct. See:

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h 
b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h
index 9050568a034c..64663112cad8 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h
@@ -242,7 +242,7 @@ struct cxgb4_next_header {
         * field's value to jump to next header such as IHL field
         * in IPv4 header.
         */
-       struct tc_u32_sel sel;
+       struct tc_u32_sel_hdr sel;
        struct tc_u32_key key;
        /* location of jump to make */
        const struct cxgb4_match_field *jump;;

You can also take a look at the original series:

https://lore.kernel.org/linux-hardening/[email protected]/

Thanks
--
Gustavo



Reply via email to