Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 4 Jan 2014 15:06:02 +0200
From:      Guy Yur <guyyur@gmail.com>
To:        freebsd-net@freebsd.org, freebsd-arm@freebsd.org
Subject:   10.0-RC1, armv6: "pfctl -s state" crashes on BeagleBone Black due to unaligned access
Message-ID:  <CAC67Hz_QXcHHSFOLLgUGqLWRQpzhRRv_b%2BWGMMQsfk-VQp74RA@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hi,

I am running 10.0-RC1 arm.armv6 on the BeagleBone Black.
The "pfctl -s state" command is crashing when trying to print the
second entry.

struct pfsync_state has a size that is not divisiable by 4 or 8 leading to the
second entry in the returned state array not being aligned and pfctl
core dumps on Bus error when trying to access a uint32_t field.

(gdb) bt
#0  print_host (addr=0x2085a11a, port=7660, af=2 '\002', opts=1024) at
/usr/src/sbin/pfctl/pf_print_state.c:178
#1  0x00021c4c in print_state (s=0x2085a0f2, opts=1024) at
/usr/src/sbin/pfctl/pf_print_state.c:236
#2  0x0000c664 in pfctl_show_states (dev=<value optimized out>,
iface=0x0, opts=1024) at /usr/src/sbin/pfctl/pfctl.c:1095

sizeof(struct pfsync_state_key) is 36
sizeof(struct pfsync_state_peer) is 32
sizeof(struct pf_addr) is 16
sizeof(struct pfsync_state) is 242

Removing the __spare[2] field will allow the struct to be aligned on 8 bytes
for the u_int64_t id field and also cover the uint32_t fields alignment
but this will break KBI.

I am currently using an inefficient workaround in pfctl_show_states
that memcpy each entry to a struct pfsync_state on the stack
ensuring each call to print_state receives an aligned struct.


10.0-RC1 World and kernel were compiled in a VirtualBox VM running
9.2-RELEASE-p2 i386.
clang and ARM_EABI used as the default make options.


Regards,
Guy



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAC67Hz_QXcHHSFOLLgUGqLWRQpzhRRv_b%2BWGMMQsfk-VQp74RA>