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

netfilter: nf_flow_table: fix big-endian integer overflow

In some configurations, gcc reports an integer overflow:

net/netfilter/nf_flow_table_offload.c: In function 'nf_flow_rule_match':
net/netfilter/nf_flow_table_offload.c:80:21: error: unsigned conversion from 'int' to '__be16' {aka 'short unsigned int'} changes value from '327680' to '0' [-Werror=overflow]
mask->tcp.flags = TCP_FLAG_RST | TCP_FLAG_FIN;
^~~~~~~~~~~~

From what I can tell, we want the upper 16 bits of these constants,
so they need to be shifted in cpu-endian mode.

Fixes: c29f74e0df7a ("netfilter: nf_flow_table: hardware offload support")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>

authored by

Arnd Bergmann and committed by
Pablo Neira Ayuso
c9b3b820 0fd26005

+1 -1
+1 -1
net/netfilter/nf_flow_table_offload.c
··· 88 88 switch (tuple->l4proto) { 89 89 case IPPROTO_TCP: 90 90 key->tcp.flags = 0; 91 - mask->tcp.flags = TCP_FLAG_RST | TCP_FLAG_FIN; 91 + mask->tcp.flags = cpu_to_be16(be32_to_cpu(TCP_FLAG_RST | TCP_FLAG_FIN) >> 16); 92 92 match->dissector.used_keys |= BIT(FLOW_DISSECTOR_KEY_TCP); 93 93 break; 94 94 case IPPROTO_UDP: