]> git.ipfire.org Git - thirdparty/nftables.git/commit
evaluate: shift immediate value when adjusting size for csum fixup
authorFlorian Westphal <fw@strlen.de>
Wed, 16 Aug 2017 15:41:30 +0000 (17:41 +0200)
committerFlorian Westphal <fw@strlen.de>
Thu, 17 Aug 2017 10:29:03 +0000 (12:29 +0200)
commit63c504cd3c0dbecbe226fbef970e700130367214
tree76ae11162d0c7295d34c41e4fc5f6849108b96f3
parent7421aec47f81d3e4180648bf4ce84a8d49ea85cb
evaluate: shift immediate value when adjusting size for csum fixup

nft add rule .. ip ttl set 64

erronously mangles ip protocol instead of ttl.

Because the kernel can't deal with odd-sized data (ttl is one byte) when
doing checksum fixups, so the write to 'ttl' is turned into

[ payload load 2b @ network header + 8 => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x000000ff ) ^ $new_value ]
[ payload write reg 1 => 2b @ network header + 8 csum_type 1 csum_off 10 csum_flags 0x0 ]

While doing so, we did fail to shift the imm value, i.e.
we clear the wrong half of the u16 (protocol) instead of csum.

The correct mask is 0xff00, and $new_value needs to be shifted
so we leave the protocol value (which is next to ttl) alone.

Fixes: f9069cefdf ("netlink: make checksum fixup work with odd-sized header fields")
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c