On Sat, Nov 20, 2021 at 10:17:54PM +0100, Alexander Bluhm wrote:
> Hi,
> 
> Regress found an data_access_fault on sparc64 pfctl
> 
> START sys/net/pf_table        2021-11-20T19:26:58Z
> 
> rm -f a.out [Ee]rrs mklog *.core y.tab.h       stamp-*  
> 
> ==== hit ====
> pfctl -qt __regress_tbl -T add -f /usr/src/regress/sys/net/pf_table/table.in
> Timeout, server ot21 not responding.
> 
> panic: kernel data fault: pc=121e9fc addr=fffffffffffc2000
> Stopped at      db_enter+0x8:   nop
>     TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
> *357996  32001      0         0x2          0    1K pfctl
> data_access_fault(400266eb460, 30, 121e9fc, fffffffffffc2000, 
> fffffffffffc2b18, 800809) at data_access_fault+0x2f0
> Ldatafault_internal(0, 0, 10000000, 40, caecb9beb0, caecba3fb8) at 
> Ldatafault_internal+0xcc
> pfr_add_addrs(4000541a800, cd395f2000, 26, 4000541ac3c, 10000000, 0) at 
> pfr_add_addrs+0x48
> pfioctl(4900, c4504443, 4000541a800, 3, 40002905b90, 0) at pfioctl+0x904
> spec_ioctl(400266eb9f8, 4002a7f8000, 1953188, 0, 0, 0) at spec_ioctl+0xb8
> VOP_IOCTL(14dca00, c4504443, 4000541a800, 1981e10, 4000431c9c0, 40002905b90) 
> at VOP_IOCTL+0x5c
> vn_ioctl(40003ebdf10, c4504443, 4000541a800, 40002905b90, 1012f50, 800) at 
> vn_ioctl+0x64
> sys_ioctl(0, 400266ebdb0, 400266ebdf0, 1878f30, 11110e0, 4d) at 
> sys_ioctl+0x234
> syscall(400266ebed0, 436, caec82dc68, caec82dc6c, 0, 85) at syscall+0x418
> syscall_setup(3, c4504443, fffffffffffc26f8, 40, caecb9beb0, caecba3fb8) at 
> syscall_setup+0x134
> https://www.openbsd.org/ddb.html describes the minimum info required in bug
> reports.  Insufficient info makes it difficult to find and fix bugs.
> 
> ddb{1}> show panic
> *cpu1: kernel data fault: pc=121e9fc addr=fffffffffffc2000
> 
> OpenBSD 7.0-current (GENERIC.MP) #1060: Fri Nov 19 14:39:41 MST 2021
>     [email protected]:/usr/src/sys/arch/sparc64/compile/GENERIC.MP
> 
> ddb{1}> trace
> data_access_fault(400266eb460, 30, 121e9fc, fffffffffffc2000, 
> fffffffffffc2b18, 800809) at data_access_fault+0x2f0
> Ldatafault_internal(0, 0, 10000000, 40, caecb9beb0, caecba3fb8) at 
> Ldatafault_internal+0xcc
> pfr_add_addrs(4000541a800, cd395f2000, 26, 4000541ac3c, 10000000, 0) at 
> pfr_add_addrs+0x48
> pfioctl(4900, c4504443, 4000541a800, 3, 40002905b90, 0) at pfioctl+0x904
> spec_ioctl(400266eb9f8, 4002a7f8000, 1953188, 0, 0, 0) at spec_ioctl+0xb8
> VOP_IOCTL(14dca00, c4504443, 4000541a800, 1981e10, 4000431c9c0, 40002905b90) 
> at VOP_IOCTL+0x5c
> vn_ioctl(40003ebdf10, c4504443, 4000541a800, 40002905b90, 1012f50, 800) at 
> vn_ioctl+0x64
> sys_ioctl(0, 400266ebdb0, 400266ebdf0, 1878f30, 11110e0, 4d) at 
> sys_ioctl+0x234
> syscall(400266ebed0, 436, caec82dc68, caec82dc6c, 0, 85) at syscall+0x418
> syscall_setup(3, c4504443, fffffffffffc26f8, 40, caecb9beb0, caecba3fb8) at 
> syscall_setup+0x134
> 
> ddb{1}> ps
>    PID     TID   PPID    UID  S       FLAGS  WAIT          COMMAND
> *32001  357996  78543      0  7         0x2                pfctl
>  78543  205553  36239      0  3    0x10008a  sigsusp       make
>  36239  119328  87511      0  3    0x10008a  sigsusp       sh
>  87511  162950  77857      0  3    0x10008a  sigsusp       make
>  48116  276236      0      0  3     0x14200  bored         sosplice
>   5397  509795      0      0  3     0x14200  bored         sensors
>  36503  235268  74172      0  3    0x100082  piperd        gzip
>  74172   14599  77857      0  3    0x100082  piperd        pax
>  77857  494115  67569      0  3        0x82  piperd        perl
>  67569  358287  43870      0  3    0x10008a  sigsusp       ksh
>  43870  111015  61303      0  3        0x9a  kqread        sshd
>  82582  428531      1      0  3    0x100083  ttyin         getty
>  98167  267822      1      0  3    0x100098  kqread        cron
>   9021  360408      0      0  3     0x14280  nfsidl        nfsio
>  50116  292519      0      0  3     0x14280  nfsidl        nfsio
>  74067  491290      0      0  3     0x14280  nfsidl        nfsio
>  23370   42309      0      0  3     0x14280  nfsidl        nfsio
>  83681  520369      1     99  3    0x100090  kqread        sndiod
>  64225  415938      1    110  3    0x100090  kqread        sndiod
>  80580  497443   3261     95  3    0x100092  kqread        smtpd
>  78262  381576   3261    103  3    0x100092  kqread        smtpd
>  47573   70104   3261     95  3    0x100092  kqread        smtpd
>  97714  501391   3261     95  3    0x100092  kqread        smtpd
>  81008  139287   3261     95  3    0x100092  kqread        smtpd
>    887   55917   3261     95  3    0x100092  kqread        smtpd
>   3261  388421      1      0  3    0x100080  kqread        smtpd
>  61303    5012      1      0  3        0x88  kqread        sshd
>  43848   49295      0      0  3     0x14200  acct          acct
>   8150  176276      1      0  3    0x100080  kqread        ntpd
>  78896   39445  74621     83  3    0x100092  kqread        ntpd
>  74621    6746      1     83  3    0x100092  kqread        ntpd
>  97682  494213  61007     74  3    0x100092  bpf           pflogd
>  61007  468432      1      0  3        0x80  netio         pflogd
>  34918  136484  89470     73  3    0x100090  kqread        syslogd
>  89470  308552      1      0  3    0x100082  netio         syslogd
>  54092  319789      1      0  3    0x100080  kqread        resolvd
>  85801  253881  94117     77  3    0x100092  kqread        dhcpleased
>  92273   98689  94117     77  3    0x100092  kqread        dhcpleased
>  94117  175861      1      0  3        0x80  kqread        dhcpleased
>  31373  280796  49165    115  3    0x100092  kqread        slaacd
>  72966  232384  49165    115  3    0x100092  kqread        slaacd
>  49165  216743      1      0  3    0x100080  kqread        slaacd
>  62832  471012      0      0  3     0x14200  bored         smr
>  22657  309869      0      0  3     0x14200  pgzero        zerothread
>  28066  488381      0      0  3     0x14200  aiodoned      aiodoned
>  17640  305742      0      0  3     0x14200  syncer        update
>  86511  196284      0      0  3     0x14200  cleaner       cleaner
>  23534  221576      0      0  3     0x14200  reaper        reaper
>  18915  201221      0      0  3     0x14200  pgdaemon      pagedaemon
>  57976  219273      0      0  3  0x40014200                idle1
>  60701  458024      0      0  3     0x14200  bored         softnet
>  34275  489143      0      0  3     0x14200  bored         systqmp
>  30178  494915      0      0  3     0x14200  bored         systq
>  42176  411931      0      0  3  0x40014200  bored         softclock
>  40939  283149      0      0  7  0x40014200                idle0
>  66755  138272      0      0  3     0x14200  kmalloc       kmthread
>      1  434460      0      0  3        0x82  wait          init
>      0       0     -1      0  3     0x10200  scheduler     swapper
> 
> ddb{1}> show register
> tstate                    0x80000600
> pc                         0x11f33c8    db_enter+0x8
> npc                        0x11f33cc    db_enter+0xc
> ipl                              0xf
> y                                  0
> g0                                 0
> g1                         0x1c07000    db_machine_command_table+0x198
> g2                               0x1
> g3                                 0
> g4                                 0
> g5                     0x400266eb127
> g6                                 0
> g7                        0xe0018000
> o0                              0x3b
> o1                     0x4002a7f8964
> o2                         0x1879078    T+0x3e8
> o3                     0x400266eb368
> o4                         0x1012f50    Lcopyfault
> o5                                 0
> o6                     0x400266ea941
> o7                         0x124376c    panic+0xcc
> l0                     0x400266eb298
> l1                     0x400266eb160
> l2                     0x400266eb2c0
> l3                     0x400266eb1e0
> l4                         0x1981e10    __guard_local
> l5                     0x4000541a800
> l6                         0x1981e10    __guard_local
> l7                     0x4000541a800
> i0                                 0
> i1                                 0
> i2                                 0
> i3                                 0
> i4                                 0
> i5                                 0
> i6                                 0
> i7                                 0
> f0                                 0
> f2                                 0
> f4                                 0
> f6                                 0
> f8                                 0
> f10                                0
> f12                                0
> f14                                0
> f16                                0
> f18                                0
> f20                                0
> f22                                0
> f24                                0
> f26                                0
> f28                                0
> f30                                0
> f32                                0
> f34                                0
> f36                                0
> f38                                0
> f40                                0
> f42                                0
> f44                                0
> f46                                0
> f48                                0
> f50                                0
> f52                                0
> f54                                0
> f56                                0
> f58                                0
> f60                                0
> f62                                0
> fsr                                0
> gsr                                0
> 
> ddb{1}> print 0x121e9fc-pfr_add_addrs
>               5c
> 
> 0000000000006b40 <pfr_add_addrs>:
> /usr/src/sys/net/pf_table.c:324
> *   6b9c:       c2 04 24 20     ld  [ %l0 + 0x420 ], %g1
>     6ba0:       80 88 60 02     btst  2, %g1
>     6ba4:       12 60 00 4d     bne,pn   %xcc, 6cd8 <pfr_add_addrs+0x198>
>     6ba8:       b0 10 20 01     mov  1, %i0
> /usr/src/sys/net/pf_table.c:326
> 
>    311  pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
>    312      int *nadd, int flags)
>    313  {
>    314          struct pfr_ktable       *kt, *tmpkt;
>    315          struct pfr_kentryworkq   workq, ioq;
>    316          struct pfr_kentry       *p, *q, *ke;
>    317          struct pfr_addr          ad;
>    318          int                      i, rv, xadd = 0;
>    319          time_t                   tzero = gettime();
>    320  
>    321          ACCEPT_FLAGS(flags, PFR_FLAG_DUMMY | PFR_FLAG_FEEDBACK);
>    322          if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
>    323                  return (EINVAL);
> *  324          if (kt->pfrkt_flags & PFR_TFLAG_CONST)
>    325                  return (EPERM);
>    326          tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0,
> 
> kt looks quite uninitialized here

It looks like the intent was something like this?

Index: pf_table.c
===================================================================
RCS file: /cvs/src/sys/net/pf_table.c,v
retrieving revision 1.138
diff -u -p -U7 -r1.138 pf_table.c
--- pf_table.c  16 Nov 2021 20:51:31 -0000      1.138
+++ pf_table.c  22 Nov 2021 00:23:39 -0000
@@ -317,16 +317,14 @@ pfr_add_addrs(struct pfr_table *tbl, str
        struct pfr_addr          ad;
        int                      i, rv, xadd = 0;
        time_t                   tzero = gettime();
 
        ACCEPT_FLAGS(flags, PFR_FLAG_DUMMY | PFR_FLAG_FEEDBACK);
        if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
                return (EINVAL);
-       if (kt->pfrkt_flags & PFR_TFLAG_CONST)
-               return (EPERM);
        tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0,
            !(flags & PFR_FLAG_USERIOCTL));
        if (tmpkt == NULL)
                return (ENOMEM);
        SLIST_INIT(&workq);
        SLIST_INIT(&ioq);
        for (i = 0; i < size; i++) {
@@ -346,14 +344,19 @@ pfr_add_addrs(struct pfr_table *tbl, str
        NET_LOCK();
        PF_LOCK();
        kt = pfr_lookup_table(tbl);
        if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
                PF_UNLOCK();
                NET_UNLOCK();
                senderr(ESRCH);
+       }
+       if (kt->pfrkt_flags & PFR_TFLAG_CONST) {
+               PF_UNLOCK();
+               NET_UNLOCK();
+               senderr(EPERM);
        }
        SLIST_FOREACH(ke, &ioq, pfrke_ioq) {
                pfr_kentry_kif_ref(ke);
                p = pfr_lookup_kentry(kt, ke, 1);
                q = pfr_lookup_kentry(tmpkt, ke, 1);
                if (flags & PFR_FLAG_FEEDBACK) {
                        if (q != NULL)

Reply via email to