generic: workaround arptables arpt_arp structure padding issue (#14577)
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 6 Dec 2013 15:42:35 +0000 (15:42 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 6 Dec 2013 15:42:35 +0000 (15:42 +0000)
Linaro GCC 4.6-2013.05 incorrectly pads the arpt_arp structure on
at least the ar71xx target, resulting in a two bytes shorter struct
in the kernel compared to what arptables userspace expects.

When comparing sizeof(struct arpt_arp) in kernel and userspace, the
former yields 162 byte, while the latter is 164 byte.

As a consequence, the subsequent target_offset and next_offset
members of the parent arpt_entry structure contain invalid values
when processed by the arptables binary, leading to bad memory
accesses in the populate_cache() procedure, subsequently causing a
segfault.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
SVN-Revision: 38999

target/linux/generic/patches-3.10/614-netfilter_arpt_arp_padding_fix.patch [new file with mode: 0644]

diff --git a/target/linux/generic/patches-3.10/614-netfilter_arpt_arp_padding_fix.patch b/target/linux/generic/patches-3.10/614-netfilter_arpt_arp_padding_fix.patch
new file mode 100644 (file)
index 0000000..70a8d04
--- /dev/null
@@ -0,0 +1,16 @@
+--- a/include/uapi/linux/netfilter_arp/arp_tables.h
++++ b/include/uapi/linux/netfilter_arp/arp_tables.h
+@@ -68,6 +68,13 @@ struct arpt_arp {
+       __u8 flags;
+       /* Inverse flags */
+       __u16 invflags;
++
++      /* For some reason Linaro GCC 4.6-2013.05 omits the two
++       * byte padding here when building for MIPS 34kc, leading to
++       * userspace abi mismatches.
++       * Add a dummy field to align this struct to 4 bytes
++       */
++      __u16 padding;
+ };
+ /* Values for "flag" field in struct arpt_ip (general arp structure).