[Bug 206658] Bus error for pfctl -sa on rpi2 r294499 snap

Jov amutu at amutu.com
Thu Jan 28 12:06:38 UTC 2016


bus error at the similar position:

Program received signal SIGBUS, Bus error.
0x00021614 in print_host (addr=0x2065111a, port=15268, af=2 '\002',
opts=1024) at /usr/src/sbin/pfctl/pf_print_state.c:178
warning: Source file is more recent than executable.

178 memcpy(&aw.v.a.addr, addr, sizeof(aw.v.a.addr));
Current language:  auto; currently minimal
(gdb) p addr
$1 = (struct pf_addr *) 0x2065111a
(gdb) p *addr
$2 = {pfa = {v4 = {s_addr = 1912711360}, v6 = {__u6_addr = {__u6_addr8 =
0x2065111a "(\001r", __u6_addr16 = 0x2065111a,
        __u6_addr32 = 0x2065111a}}, addr8 = 0x2065111a "(\001r", addr16 =
0x2065111a, addr32 = 0x2065111a}}
(gdb) p 0x2065111a
$3 = 543494426
(gdb)

Jov
blog: http:amutu.com/blog <http://amutu.com/blog>

2016-01-27 22:03 GMT+08:00 Ian Lepore <ian at freebsd.org>:

> On Wed, 2016-01-27 at 20:34 +0800, Jov wrote:
> > Warning: Object directory not changed from original
> > /usr/src/sbin/pfctl
> > cc -O -pipe -mfloat-abi=softfp   -Wall -Wmissing-prototypes
> > -Wno-uninitialized -Wstrict-prototypes -DENABLE_ALTQ
> > -I/usr/src/sbin/pfctl
> > -DWITH_INET6 -DWITH_INET -g -std=gnu99 -Wsystem-headers -Werror -Wall
> > -Wno-format-y2k -Wno-uninitialized -Wno-pointer-sign -Wno-empty-body
> > -Wno-string-plus-int -Wno-unused-const-variable -Wno-tautological
> > -compare
> > -Wno-unused-value -Wno-parentheses-equality -Wno-unuse  function
> > -Wno-enum-conversion -Wno-unused-local-typedef -Wno-switch -Wno
> > -switch-enum
> > -Wno-knr-promoted-parameter  -Qunused-arguments -c pf_print_state.c
> > -o
> > pf_print_state.o
> > pf_print_state.c:149:25: error: passing 'struct in_addr' to parameter
> > of
> > incompatible type 'const void *'
> >                 memcpy(&sin.sin_addr, addr->v4,
> > sizeof(sin.sin_addr));
> >                                       ^~~~~~~~
> > /usr/include/string.h:62:56: note: passing argument to parameter here
> > void    *memcpy(void * __restrict, const void * __restrict, size_t);
> >                                                           ^
> > pf_print_state.c:160:27: error: passing 'struct in6_addr' to
> > parameter of
> > incompatible type 'const void *'
> >                 memcpy(&sin6.sin6_addr, addr->v6,
> > sizeof(sin6.sin6_addr));
> >                                         ^~~~~~~~
> > /usr/include/string.h:62:56: note: passing argument to parameter here
> > void    *memcpy(void * __restrict, const void * __restrict, size_t);
> >                                                           ^
> > 2 errors generated.
> > *** Error code 1
> >
> > Stop.
> > make: stopped in /usr/src/sbin/pfctl
> >
>
> Oops, sorry about that, try this one...
>
> -- Ian
>
> Index: sbin/pfctl/pf_print_state.c
> ===================================================================
> --- sbin/pfctl/pf_print_state.c (revision 294860)
> +++ sbin/pfctl/pf_print_state.c (working copy)
> @@ -146,7 +146,7 @@ print_name(struct pf_addr *addr, sa_family_t af)
>                 memset(&sin, 0, sizeof(sin));
>                 sin.sin_len = sizeof(sin);
>                 sin.sin_family = AF_INET;
> -               sin.sin_addr = addr->v4;
> +               memcpy(&sin.sin_addr, &addr->v4, sizeof(sin.sin_addr));
>                 getnameinfo((struct sockaddr *)&sin, sin.sin_len,
>                     host, sizeof(host), NULL, 0, NI_NOFQDN);
>                 break;
> @@ -157,7 +157,7 @@ print_name(struct pf_addr *addr, sa_family_t af)
>                 memset(&sin6, 0, sizeof(sin6));
>                 sin6.sin6_len = sizeof(sin6);
>                 sin6.sin6_family = AF_INET6;
> -               sin6.sin6_addr = addr->v6;
> +               memcpy(&sin6.sin6_addr, &addr->v6, sizeof(sin6.sin6_addr));
>                 getnameinfo((struct sockaddr *)&sin6, sin6.sin6_len,
>                     host, sizeof(host), NULL, 0, NI_NOFQDN);
>                 break;
> @@ -175,7 +175,7 @@ print_host(struct pf_addr *addr, u_int16_t port, s
>                 struct pf_addr_wrap aw;
>
>                 memset(&aw, 0, sizeof(aw));
> -               aw.v.a.addr = *addr;
> +               memcpy(&aw.v.a.addr, addr, sizeof(aw.v.a.addr));
>                 if (af == AF_INET)
>                         aw.v.a.mask.addr32[0] = 0xffffffff;
>                 else {
>
>


More information about the freebsd-arm mailing list