Date: Thu, 9 Jan 2014 15:29:42 +0100 From: =?ISO-8859-1?Q?Ermal_Lu=E7i?= <eri@freebsd.org> To: Gleb Smirnoff <glebius@freebsd.org> Cc: freebsd-net <freebsd-net@freebsd.org>, freebsd-arm@freebsd.org, Guy Yur <guyyur@gmail.com> Subject: Re: 10.0-RC1, armv6: "pfctl -s state" crashes on BeagleBone Black due to unaligned access Message-ID: <CAPBZQG2Xzgt8fcTnqJ-EYY1t5qf6CUTC7E9G8TMufHm9ZYCO3g@mail.gmail.com> In-Reply-To: <20140109104223.GS71033@FreeBSD.org> References: <CAC67Hz_QXcHHSFOLLgUGqLWRQpzhRRv_b%2BWGMMQsfk-VQp74RA@mail.gmail.com> <20140109104223.GS71033@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jan 9, 2014 at 11:42 AM, Gleb Smirnoff <glebius@freebsd.org> wrote: > Guy, > > On Sat, Jan 04, 2014 at 03:06:02PM +0200, Guy Yur wrote: > G> I am running 10.0-RC1 arm.armv6 on the BeagleBone Black. > G> The "pfctl -s state" command is crashing when trying to print the > G> second entry. > G> > G> struct pfsync_state has a size that is not divisiable by 4 or 8 leading > to the > G> second entry in the returned state array not being aligned and pfctl > G> core dumps on Bus error when trying to access a uint32_t field. > G> > G> (gdb) bt > G> #0 print_host (addr=0x2085a11a, port=7660, af=2 '\002', opts=1024) at > G> /usr/src/sbin/pfctl/pf_print_state.c:178 > G> #1 0x00021c4c in print_state (s=0x2085a0f2, opts=1024) at > G> /usr/src/sbin/pfctl/pf_print_state.c:236 > G> #2 0x0000c664 in pfctl_show_states (dev=<value optimized out>, > G> iface=0x0, opts=1024) at /usr/src/sbin/pfctl/pfctl.c:1095 > G> > G> sizeof(struct pfsync_state_key) is 36 > G> sizeof(struct pfsync_state_peer) is 32 > G> sizeof(struct pf_addr) is 16 > G> sizeof(struct pfsync_state) is 242 > G> > G> Removing the __spare[2] field will allow the struct to be aligned on 8 > bytes > G> for the u_int64_t id field and also cover the uint32_t fields alignment > G> but this will break KBI. > G> > G> I am currently using an inefficient workaround in pfctl_show_states > G> that memcpy each entry to a struct pfsync_state on the stack > G> ensuring each call to print_state receives an aligned struct. > G> > G> 10.0-RC1 World and kernel were compiled in a VirtualBox VM running > G> 9.2-RELEASE-p2 i386. > G> clang and ARM_EABI used as the default make options. > > For pf we are ready to break KBI. It uses same structs for internal kernel > representation and for ioctl() API and this is actually a bug. Until it is > properly fixed, we are doomed to break KBI always. > > Unfortunately, pfsync_state is not only a KBI but also a wire protocol for > pfsync(4). We can't break this, since that would make different FreeBSD > versions not exchanging states properly. > > Well, <= 8.x already is incompatible with >= 9.x, thanks yet another > OpenBSD > import. But we don't want to introduce another one. > > I will try to fix this making new structure for the ioctl. That will mean > moving slowly towards divorcing internal structures and ioctl ones. > > I'd appreciate if you file a PR on that, so that problem won't leave > forgotten > in the mailing list. You can even code the bugfix :) > > Thanks! > > Well pfsync has a version in its header so its quite possible to support many of them. > -- > Totus tuus, Glebius. > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" > -- Ermal
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPBZQG2Xzgt8fcTnqJ-EYY1t5qf6CUTC7E9G8TMufHm9ZYCO3g>