Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfilter: nf_tables: fix port natting in little endian archs

Make sure this fetches 16-bits port data from the register.
Remove casting to make sparse happy, not needed anymore.

Signed-off-by: leroy christophe <christophe.leroy@c-s.fr>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>

authored by

leroy christophe and committed by
Pablo Neira Ayuso
7b5bca46 70314fc6

+12 -12
+4 -4
net/ipv4/netfilter/nft_redir_ipv4.c
··· 27 27 28 28 memset(&mr, 0, sizeof(mr)); 29 29 if (priv->sreg_proto_min) { 30 - mr.range[0].min.all = (__force __be16) 31 - data[priv->sreg_proto_min].data[0]; 32 - mr.range[0].max.all = (__force __be16) 33 - data[priv->sreg_proto_max].data[0]; 30 + mr.range[0].min.all = 31 + *(__be16 *)&data[priv->sreg_proto_min].data[0]; 32 + mr.range[0].max.all = 33 + *(__be16 *)&data[priv->sreg_proto_max].data[0]; 34 34 mr.range[0].flags |= NF_NAT_RANGE_PROTO_SPECIFIED; 35 35 } 36 36
+4 -4
net/ipv6/netfilter/nft_redir_ipv6.c
··· 27 27 28 28 memset(&range, 0, sizeof(range)); 29 29 if (priv->sreg_proto_min) { 30 - range.min_proto.all = (__force __be16) 31 - data[priv->sreg_proto_min].data[0]; 32 - range.max_proto.all = (__force __be16) 33 - data[priv->sreg_proto_max].data[0]; 30 + range.min_proto.all = 31 + *(__be16 *)&data[priv->sreg_proto_min].data[0]; 32 + range.max_proto.all = 33 + *(__be16 *)&data[priv->sreg_proto_max].data[0]; 34 34 range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; 35 35 } 36 36
+4 -4
net/netfilter/nft_nat.c
··· 65 65 } 66 66 67 67 if (priv->sreg_proto_min) { 68 - range.min_proto.all = (__force __be16) 69 - data[priv->sreg_proto_min].data[0]; 70 - range.max_proto.all = (__force __be16) 71 - data[priv->sreg_proto_max].data[0]; 68 + range.min_proto.all = 69 + *(__be16 *)&data[priv->sreg_proto_min].data[0]; 70 + range.max_proto.all = 71 + *(__be16 *)&data[priv->sreg_proto_max].data[0]; 72 72 range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; 73 73 } 74 74