| From 5270b58e23c7fbef37fecb962547c2e45ac85aaa Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 30 Apr 2020 23:30:48 +0200 |
| Subject: netfilter: conntrack: avoid gcc-10 zero-length-bounds warning |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit 2c407aca64977ede9b9f35158e919773cae2082f ] |
| |
| gcc-10 warns around a suspicious access to an empty struct member: |
| |
| net/netfilter/nf_conntrack_core.c: In function '__nf_conntrack_alloc': |
| net/netfilter/nf_conntrack_core.c:1522:9: warning: array subscript 0 is outside the bounds of an interior zero-length array 'u8[0]' {aka 'unsigned char[0]'} [-Wzero-length-bounds] |
| 1522 | memset(&ct->__nfct_init_offset[0], 0, |
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~ |
| In file included from net/netfilter/nf_conntrack_core.c:37: |
| include/net/netfilter/nf_conntrack.h:90:5: note: while referencing '__nfct_init_offset' |
| 90 | u8 __nfct_init_offset[0]; |
| | ^~~~~~~~~~~~~~~~~~ |
| |
| The code is correct but a bit unusual. Rework it slightly in a way that |
| does not trigger the warning, using an empty struct instead of an empty |
| array. There are probably more elegant ways to do this, but this is the |
| smallest change. |
| |
| Fixes: c41884ce0562 ("netfilter: conntrack: avoid zeroing timer") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/net/netfilter/nf_conntrack.h | 2 +- |
| net/netfilter/nf_conntrack_core.c | 4 ++-- |
| 2 files changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h |
| index 9f551f3b69c65..90690e37a56f0 100644 |
| --- a/include/net/netfilter/nf_conntrack.h |
| +++ b/include/net/netfilter/nf_conntrack.h |
| @@ -87,7 +87,7 @@ struct nf_conn { |
| struct hlist_node nat_bysource; |
| #endif |
| /* all members below initialized via memset */ |
| - u8 __nfct_init_offset[0]; |
| + struct { } __nfct_init_offset; |
| |
| /* If we were expected by an expectation, this will be it */ |
| struct nf_conn *master; |
| diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c |
| index 1927fc296f951..6a978d7e0d639 100644 |
| --- a/net/netfilter/nf_conntrack_core.c |
| +++ b/net/netfilter/nf_conntrack_core.c |
| @@ -1517,9 +1517,9 @@ __nf_conntrack_alloc(struct net *net, |
| ct->status = 0; |
| ct->timeout = 0; |
| write_pnet(&ct->ct_net, net); |
| - memset(&ct->__nfct_init_offset[0], 0, |
| + memset(&ct->__nfct_init_offset, 0, |
| offsetof(struct nf_conn, proto) - |
| - offsetof(struct nf_conn, __nfct_init_offset[0])); |
| + offsetof(struct nf_conn, __nfct_init_offset)); |
| |
| nf_ct_zone_add(ct, zone); |
| |
| -- |
| 2.20.1 |
| |