netfilter: nf_tables: fix nft_cmp_fast failure on big endian for size < 4
authorPatrick McHardy <kaber@trash.net>
Sat, 12 Apr 2014 11:17:57 +0000 (13:17 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 14 Apr 2014 08:38:02 +0000 (10:38 +0200)
commitb855d416dc17061ebb271ea7ef1201d100531770
treec021bbfd8d0f1e47675fbe1bbce9889c7f0ecf96
parentee214d54bf3d51259adf8917e26dc84df1cab05a
netfilter: nf_tables: fix nft_cmp_fast failure on big endian for size < 4

nft_cmp_fast is used for equality comparisions of size <= 4. For
comparisions of size < 4 byte a mask is calculated that is applied to
both the data from userspace (during initialization) and the register
value (during runtime). Both values are stored using (in effect) memcpy
to a memory area that is then interpreted as u32 by nft_cmp_fast.

This works fine on little endian since smaller types have the same base
address, however on big endian this is not true and the smaller types
are interpreted as a big number with trailing zero bytes.

The mask therefore must not include the lower bytes, but the higher bytes
on big endian. Add a helper function that does a cpu_to_le32 to switch
the bytes on big endian. Since we're dealing with a mask of just consequitive
bits, this works out fine.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nf_tables_core.h
net/netfilter/nf_tables_core.c
net/netfilter/nft_cmp.c