Re: [nf-next PATCH v2] netfilter: include: uapi: Use C99 flexible array member

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Please, see this:

https://git.kernel.org/linus/1e6e9d0f4859ec698d55381ea26f4136eff3afe1

We are refraining from doing flexible-array conversions in UAPI, for now.

--
Gustavo

On 7/19/20 05:02, Phil Sutter wrote:
> Recent versions of gcc started to complain about the old-style
> zero-length array as last member of various structs. For instance, while
> compiling iptables:
> 
> | In file included from /usr/include/string.h:495,
> |                  from libip4tc.c:15:
> | In function 'memcpy',
> |     inlined from 'iptcc_compile_chain' at libiptc.c:1172:2,
> |     inlined from 'iptcc_compile_table' at libiptc.c:1243:13,
> |     inlined from 'iptc_commit' at libiptc.c:2572:8,
> |     inlined from 'iptc_commit' at libiptc.c:2510:1:
> | /usr/include/bits/string_fortified.h:34:10: warning: writing 16 bytes into a region of size 0 [-Wstringop-overflow=]
> |    34 |   return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
> |       |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> | In file included from ../include/libiptc/libiptc.h:12,
> |                  from libip4tc.c:29:
> | libiptc.c: In function 'iptc_commit':
> | ../include/linux/netfilter_ipv4/ip_tables.h:202:19: note: at offset 0 to object 'entries' with size 0 declared here
> |   202 |  struct ipt_entry entries[0];
> |       |                   ^~~~~~~
> 
> (Similar for libip6tc.c.)
> 
> Avoid this warning by declaring these fields as an ISO C99 flexible
> array member. This makes gcc aware of the intended use and enables
> sanity checking as described in:
> https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
> 
> This patch is actually a follow-up on commit 6daf14140129d ("netfilter:
> Replace zero-length array with flexible-array member") which seems to
> have missed a few spots. Like it, alignment attribute syntax is fixed
> where found in line with zero-length array fields.
> 
> Cc: Gustavo A. R. Silva <gustavo@xxxxxxxxxxxxxx>
> Signed-off-by: Phil Sutter <phil@xxxxxx>
> ---
> Changes since v1:
> - Fix up any zero-length arrays found via:
>   `grep -r '\[0\]' include/uapi/linux/netfilter*`.
> - Perform alignment attribute syntax fixup just like 6daf14140129d does.
> - Point at relationship with 6daf14140129d in commit message.
> - Add Gustavo to Cc: for verification.
> ---
>  include/uapi/linux/netfilter/x_tables.h         |  6 +++---
>  include/uapi/linux/netfilter_arp/arp_tables.h   |  6 +++---
>  include/uapi/linux/netfilter_bridge/ebt_among.h |  2 +-
>  include/uapi/linux/netfilter_bridge/ebtables.h  | 10 +++++-----
>  include/uapi/linux/netfilter_ipv4/ip_tables.h   |  6 +++---
>  include/uapi/linux/netfilter_ipv6/ip6_tables.h  |  6 +++---
>  6 files changed, 18 insertions(+), 18 deletions(-)
> 
> diff --git a/include/uapi/linux/netfilter/x_tables.h b/include/uapi/linux/netfilter/x_tables.h
> index a8283f7dbc519..7a52c69c74a2b 100644
> --- a/include/uapi/linux/netfilter/x_tables.h
> +++ b/include/uapi/linux/netfilter/x_tables.h
> @@ -28,7 +28,7 @@ struct xt_entry_match {
>  		__u16 match_size;
>  	} u;
>  
> -	unsigned char data[0];
> +	unsigned char data[];
>  };
>  
>  struct xt_entry_target {
> @@ -51,7 +51,7 @@ struct xt_entry_target {
>  		__u16 target_size;
>  	} u;
>  
> -	unsigned char data[0];
> +	unsigned char data[];
>  };
>  
>  #define XT_TARGET_INIT(__name, __size)					       \
> @@ -119,7 +119,7 @@ struct xt_counters_info {
>  	unsigned int num_counters;
>  
>  	/* The counters (actually `number' of these). */
> -	struct xt_counters counters[0];
> +	struct xt_counters counters[];
>  };
>  
>  #define XT_INV_PROTO		0x40	/* Invert the sense of PROTO. */
> diff --git a/include/uapi/linux/netfilter_arp/arp_tables.h b/include/uapi/linux/netfilter_arp/arp_tables.h
> index bbf5af2b67a8f..a6ac2463f787a 100644
> --- a/include/uapi/linux/netfilter_arp/arp_tables.h
> +++ b/include/uapi/linux/netfilter_arp/arp_tables.h
> @@ -109,7 +109,7 @@ struct arpt_entry
>  	struct xt_counters counters;
>  
>  	/* The matches (if any), then the target. */
> -	unsigned char elems[0];
> +	unsigned char elems[];
>  };
>  
>  /*
> @@ -181,7 +181,7 @@ struct arpt_replace {
>  	struct xt_counters __user *counters;
>  
>  	/* The entries (hang off end: not really an array). */
> -	struct arpt_entry entries[0];
> +	struct arpt_entry entries[];
>  };
>  
>  /* The argument to ARPT_SO_GET_ENTRIES. */
> @@ -193,7 +193,7 @@ struct arpt_get_entries {
>  	unsigned int size;
>  
>  	/* The entries. */
> -	struct arpt_entry entrytable[0];
> +	struct arpt_entry entrytable[];
>  };
>  
>  /* Helper functions */
> diff --git a/include/uapi/linux/netfilter_bridge/ebt_among.h b/include/uapi/linux/netfilter_bridge/ebt_among.h
> index 9acf757bc1f79..73b26a280c4fd 100644
> --- a/include/uapi/linux/netfilter_bridge/ebt_among.h
> +++ b/include/uapi/linux/netfilter_bridge/ebt_among.h
> @@ -40,7 +40,7 @@ struct ebt_mac_wormhash_tuple {
>  struct ebt_mac_wormhash {
>  	int table[257];
>  	int poolsize;
> -	struct ebt_mac_wormhash_tuple pool[0];
> +	struct ebt_mac_wormhash_tuple pool[];
>  };
>  
>  #define ebt_mac_wormhash_size(x) ((x) ? sizeof(struct ebt_mac_wormhash) \
> diff --git a/include/uapi/linux/netfilter_bridge/ebtables.h b/include/uapi/linux/netfilter_bridge/ebtables.h
> index a494cf43a7552..0b4f8994a0a54 100644
> --- a/include/uapi/linux/netfilter_bridge/ebtables.h
> +++ b/include/uapi/linux/netfilter_bridge/ebtables.h
> @@ -87,7 +87,7 @@ struct ebt_entries {
>  	/* nr. of entries */
>  	unsigned int nentries;
>  	/* entry list */
> -	char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
> +	char data[] __aligned(__alignof__(struct ebt_replace));
>  };
>  
>  /* used for the bitmask of struct ebt_entry */
> @@ -129,7 +129,7 @@ struct ebt_entry_match {
>  	} u;
>  	/* size of data */
>  	unsigned int match_size;
> -	unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
> +	unsigned char data[] __aligned(__alignof__(struct ebt_replace));
>  };
>  
>  struct ebt_entry_watcher {
> @@ -142,7 +142,7 @@ struct ebt_entry_watcher {
>  	} u;
>  	/* size of data */
>  	unsigned int watcher_size;
> -	unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
> +	unsigned char data[] __aligned(__alignof__(struct ebt_replace));
>  };
>  
>  struct ebt_entry_target {
> @@ -155,7 +155,7 @@ struct ebt_entry_target {
>  	} u;
>  	/* size of data */
>  	unsigned int target_size;
> -	unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
> +	unsigned char data[] __aligned(__alignof__(struct ebt_replace));
>  };
>  
>  #define EBT_STANDARD_TARGET "standard"
> @@ -188,7 +188,7 @@ struct ebt_entry {
>  	unsigned int target_offset;
>  	/* sizeof ebt_entry + matches + watchers + target */
>  	unsigned int next_offset;
> -	unsigned char elems[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
> +	unsigned char elems[] __aligned(__alignof__(struct ebt_replace));
>  };
>  
>  static __inline__ struct ebt_entry_target *
> diff --git a/include/uapi/linux/netfilter_ipv4/ip_tables.h b/include/uapi/linux/netfilter_ipv4/ip_tables.h
> index 50c7fee625ae9..1485df28b2391 100644
> --- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
> +++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
> @@ -121,7 +121,7 @@ struct ipt_entry {
>  	struct xt_counters counters;
>  
>  	/* The matches (if any), then the target. */
> -	unsigned char elems[0];
> +	unsigned char elems[];
>  };
>  
>  /*
> @@ -203,7 +203,7 @@ struct ipt_replace {
>  	struct xt_counters __user *counters;
>  
>  	/* The entries (hang off end: not really an array). */
> -	struct ipt_entry entries[0];
> +	struct ipt_entry entries[];
>  };
>  
>  /* The argument to IPT_SO_GET_ENTRIES. */
> @@ -215,7 +215,7 @@ struct ipt_get_entries {
>  	unsigned int size;
>  
>  	/* The entries. */
> -	struct ipt_entry entrytable[0];
> +	struct ipt_entry entrytable[];
>  };
>  
>  /* Helper functions */
> diff --git a/include/uapi/linux/netfilter_ipv6/ip6_tables.h b/include/uapi/linux/netfilter_ipv6/ip6_tables.h
> index d9e364f96a5cf..d4d7f47d9104d 100644
> --- a/include/uapi/linux/netfilter_ipv6/ip6_tables.h
> +++ b/include/uapi/linux/netfilter_ipv6/ip6_tables.h
> @@ -125,7 +125,7 @@ struct ip6t_entry {
>  	struct xt_counters counters;
>  
>  	/* The matches (if any), then the target. */
> -	unsigned char elems[0];
> +	unsigned char elems[];
>  };
>  
>  /* Standard entry */
> @@ -243,7 +243,7 @@ struct ip6t_replace {
>  	struct xt_counters __user *counters;
>  
>  	/* The entries (hang off end: not really an array). */
> -	struct ip6t_entry entries[0];
> +	struct ip6t_entry entries[];
>  };
>  
>  /* The argument to IP6T_SO_GET_ENTRIES. */
> @@ -255,7 +255,7 @@ struct ip6t_get_entries {
>  	unsigned int size;
>  
>  	/* The entries. */
> -	struct ip6t_entry entrytable[0];
> +	struct ip6t_entry entrytable[];
>  };
>  
>  /* Helper functions */
> 



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux