SIGSEGV on rt-prune-step, v1.3.7 and git HEAD

Henrique de Moraes Holschuh hmh at hmh.eng.br
Thu Apr 5 18:22:11 CEST 2012


I am trying to build a bit more advanced border router here capable of uRPF.
For that reason, each eBGP peer gets its own kernel table, and bird is used
to feed RST_BGP, RTS_STATIC and RTS_DEVICE routes to these supplementary
tables, instead of messing with the "main" kernel routing table.

Well, the Linux kernel syncer is not very sturdy ATM: it is prone to leaving
behind some routes (which are correctly annotated as proto bird) when you
set it to "persist 0".  And it also segfaults...

It segfaults both in v1.3.7 and git HEAD, so it is not a bug in the new
"batched" route flushing code.

Here's gdb output for git HEAD (standard hardened Debian build of bird):

Starting program: /usr/sbin/bird -c /etc/bird/bird.conf -d -D /tmp/debug -u
bird -g birdctl
[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
0x000055555555d816 in rt_prune_step (max_feed=<optimized out>,
tab=<optimized out>) at ../../nest/rt-table.c:958
958     ../../nest/rt-table.c: No such file or directory.
        in ../../nest/rt-table.c

line 958 of nest/rt-table.c tries to reference e->sender, which apparently
can be NULL (whether it *should* be NULL I don't know):

    rescan:
      for (e=n->routes; e; e=e->next)
        if (e->sender->core_state != FS_HAPPY &&    *** SIGSEGV HERE
            e->sender->core_state != FS_FEEDING)
          { 
            if (*max_feed <= 0)
              { 
                FIB_ITERATE_PUT(fit, fn);
                return 0;
              }

            rte_discard(tab, e);
            (*max_feed)--;

            goto rescan;
          }

Any ideas?

-- 
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh



More information about the Bird-users mailing list