Half the cpu platforms fault on unaligned access. There are strategies for handling this. Your code must use them.
It is kind of boring, actually. Peter J. Philipp <[email protected]> wrote: > On Wed, Nov 27, 2019 at 03:30:23PM +0100, Peter J. Philipp wrote: > > Hi David, > > > > I'm going to upgrade to -current and then report back.. it'll take me a few > > days to do that (I'm super slow). > > > > ... > > I'll see if this sort of issue repeats after I upgrade the octeon router > > to -current. > > > > Thanks! > > -peter > > Hi David and Misc@, > > OK this is weird. For people who are just reading this thread it's about > OpenBSD/octeon SIGBUS'ing my program with an unalignment error. > > I upgraded to -current (very pleased that pppoe0 works now, as an aside), > and got the debug right after the fork. Here is the output of gdb > > debug.1---> > Continuing. > > Program received signal SIGBUS, Bus error. > lookup_axfr (f=0x2c6274db78, so=6, zonename=0x2c6b3d2130 "words.", > mysoa=0xfffffe7920, format=20, tsigkey=0x2c37b083d0 "pass", > tsigpass=0xfffffe7b60 "*censored*=", > segment=0xfffffe7b40, answers=0xfffffe7b3c, additionalcount=0xfffffe7b38) > at util.c:1842 > 1842 *type = htons(DNS_TYPE_AXFR); > (gdb) list > 1837 > 1838 memcpy(p, name, len); > 1839 totallen += len; > 1840 > 1841 type = (u_int16_t *)&query[totallen]; > 1842 *type = htons(DNS_TYPE_AXFR); > 1843 totallen += sizeof(u_int16_t); > 1844 > 1845 class = (u_int16_t *)&query[totallen]; > 1846 *class = htons(DNS_CLASS_IN); > (gdb) print type > $1 = (u_int16_t *) 0xfffffe763d > <----- > > So I point a pointer of type u_int16_t to a memory address (which may be > unaligned) and then load it with a value. I've always done it this way > throughout my program, but just to be sure that it isn't caused by the stack > somehow I moved query variable to the heap (or it's equivalent) and tried > again. > > debug.2---> > Loaded symbols for /usr/libexec/ld.so > pull_remote_zone (lrz=0x216549d000) at parse.y:3605 > 3605 while (debugger == 1) > (gdb) set debugger=0 > Current language: auto; currently minimal > (gdb) cont > Continuing. > > Program received signal SIGBUS, Bus error. > lookup_axfr (f=0x21b8dfdb78, so=6, zonename=0x22041a4a10 "words.", > mysoa=0xffffff9050, format=20, tsigkey=0x22052c35b0 "pass", > tsigpass=0xffffff9290 "*censored*=", > segment=0xffffff9270, answers=0xffffff926c, additionalcount=0xffffff9268) > at util.c:1849 > 1849 *type = htons(DNS_TYPE_AXFR); > (gdb) print type > $1 = (u_int16_t *) 0x21d57f1015 > (gdb) print query > $2 = 0x21d57f1000 "" > (gdb) print (char*)type - query > $3 = 21 > <------- > > So now I have a true offset of variable type it's not aligned. What can I > do here? Does this need fixing in OpenBSD/octeon or do I have to fix my > code for this? I don't really know what to use instead of this other than > memcpy'ing this value instead of (overloading?) the 16 bit integer. > > Any help is welcomed! > > Best regards, > -peter >

