Hi BIRD Team,

I wanna report a crash with BIRD 3.1.5 running on NixOS.

The crash triggers a `bug()` assertion failure related to locking mechanisms 
during interface lookup (`if_find_by_index`).

I have successfully reproduced this issue locally with a minimal configuration.

Environment:
- BIRD Version: 3.1.5
- OS: NixOS unstable (glibc 2.40)
- Kernel: Linux 6.17.9 #1-NixOS SMP PREEMPT_DYNAMIC x86_64 GNU/Linux

Reproduction Steps:
1. Configure a BGP protocol using an IPv6 Link-Local neighbor on a physical 
interface.
2. Start BIRD. Wait for the protocol to enter 'Active' or 'Connect' state so 
the port is listening.
3. Initiate a TCP connection to the BGP port:
   $ nc -6 -v <Link-Local-IP>%<interface> <port>
4. BIRD crashes immediately upon receiving the connection.

Crash Summary (from GDB):
The main thread (Thread 1) hits a bug() assertion:
#3  0x000056536f6ef97a in bug (msg=<optimized out>) at sysdep/unix/log.c:412
#4  0x000056536f6fa9a1 in do_lock (dg=0x5653774ace60, lsp=0x7fba0208a2a8) at 
sysdep/unix/domain.c:116
#5  0x000056536f64c8ac in if_find_by_index (idx=23) at nest/iface.c:721
#6  0x000056536f6e4ac8 in sockaddr_read6 ... at sysdep/unix/io.c:583
#8  0x000056536f6ecfd7 in sk_passive_connected ... at sysdep/unix/io.c:1451

Attachments:
1. backtrace.txt: Full GDB backtrace.
2. config_snippet.txt: The minimal config used to reproduce the crash.

Best regards,
Moraxyc
log stderr all;
router id 10.0.0.1;

protocol device {
    scan time 20;
}

# 1. Using an IPv6 Link-Local neighbor on a real interface.
# 2. Protocol state transitions to Active/Connect (socket opens).
# 3. An incoming TCP connection hits the port.
protocol bgp crash_test {
    local as 65000;
    local port 17999;

    neighbor fe80::1234 % 'eth0' as 65001;

    ipv4 { import all; export all; };
    ipv6 { import all; export all; };
}
(gdb) set pagination off
(gdb) bt full
#0  0x00007fba01e9caac in __pthread_kill_implementation ()
   from /nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#1  0x00007fba01e4190e in raise () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#2  0x00007fba01e28942 in abort () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#3  0x000056536f6ef97a in bug (msg=<optimized out>) at sysdep/unix/log.c:412
        args = {{gp_offset = 8, fp_offset = 48, overflow_arg_area = 
0x7fff7fe3b670, reg_save_area = 0x7fff7fe3b5b0}}
#4  0x000056536f6fa9a1 in do_lock (dg=0x5653774ace60, lsp=0x7fba0208a2a8) at 
sysdep/unix/domain.c:116
        stack_copy = {the_bird = 0x56536f7a1700 <the_bird_domain_gen.lto_priv>, 
meta = 0x0, control = 0x0, proto = 0x0,
          service = 0x0, rtable = 0x5653774b9140, attrs = 0x0, logging = 0x0, 
resource = 0x0}
        lll = <optimized out>
        lock_begin = <optimized out>
        duration = <optimized out>
        wdw = <optimized out>
#5  0x000056536f64c8ac in if_find_by_index (idx=23) at nest/iface.c:721
        i = <optimized out>
#6  0x000056536f6e4ac8 in sockaddr_read6 (sa=0x5653774b9140, a=0x56537750ce10, 
ifa=0x56537750cdd8, port=0x56537750ce38)
    at sysdep/unix/io.c:583
No locals.
#7  sockaddr_read (sa=sa@entry=0x7fff7fe3b780, af=<optimized out>, 
a=a@entry=0x56537750cd98, ifa=ifa@entry=0x56537750cdd8,
    port=port@entry=0x56537750cdc0) at sysdep/unix/io.c:595
No locals.
#8  0x000056536f6ecfd7 in sk_passive_connected (s=0x56537760f790, 
type=<optimized out>) at sysdep/unix/io.c:1451
        loc_sa = {sa = {sa_family = 10, sa_data = 
"\000\263\000\000\000\000\376\200\000\000\000\000\000"},
          padding = "\000\000\000\000\000\0000\021\027\000\000\000SV\000"}
        rem_sa = {sa = {sa_family = 10, sa_data = 
"\263\223\000\000\000\000\376\200\000\000\000\000\000"},
          padding = "\000\000\000\000\000\000\0254\027\000\000\000\272\000\000"}
        loc_sa_len = 28
        rem_sa_len = 28
        fd = 22
        sock_lock = <optimized out>
        t = 0x56537750cd60
#9  0x000056536f618de2 in sk_read (s=<optimized out>, revents=<optimized out>) 
at sysdep/unix/io.c:2330
        e = <optimized out>
        e = <optimized out>
#10 io_loop () at sysdep/unix/io.c:2777
        s = <optimized out>
        count = 1
        timeout = <optimized out>
        pout = <optimized out>
        poll_tout = <optimized out>
        events = <optimized out>
        t = <optimized out>
        pfd = {pfd = {data = 0x5653775f9f70, used = 5, size = 16}, loop = {data 
= 0x5653775fa030, used = 5, size = 16}}
        poll_tout = <optimized out>
        timeout = <optimized out>
        events = <optimized out>
        pout = <optimized out>
        t = <optimized out>
        pfd = <optimized out>
        next2 = <optimized out>
        count = <optimized out>
        _orig = <optimized out>
        _ptr = <optimized out>
        _ = <optimized out>
        s = <optimized out>
        e = <optimized out>
        steps = <optimized out>
        _orig = <optimized out>
        _ptr = <optimized out>
        _ = <optimized out>
        s = <optimized out>
#11 main (argc=<optimized out>, argv=<optimized out>) at sysdep/unix/main.c:1106
        use_uid = <optimized out>
        use_gid = <optimized out>
        conf = <optimized out>
(gdb) thread apply all bt full

Thread 3 (Thread 0x7fba015ff6c0 (LWP 857837)):
#0  0x00007fba01f1443d in poll () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#1  0x000056536f6f669e in poll (__fds=<optimized out>, __nfds=<optimized out>, 
__timeout=<optimized out>, __fds=<optimized out>, __nfds=<optimized out>, 
__timeout=<optimized out>) at 
/nix/store/gi4cz4ir3zlwhf1azqfgxqdnczfrwsr7-glibc-2.40-66-dev/include/bits/poll2.h:44
No locals.
#2  bird_thread_main (arg=0x5653775fa520) at sysdep/unix/io-loop.c:1013
        thr_loop_start = <optimized out>
        timeout = 2794
        thr_before_run = <optimized out>
        idle_force = <optimized out>
        busy_now = <optimized out>
        rv = <optimized out>
        __atomic_load_ptr = <optimized out>
        __atomic_load_ptr = <optimized out>
        loop = <optimized out>
        __atomic_load_ptr = <optimized out>
        __atomic_load_ptr = <optimized out>
        __atomic_load_tmp = <optimized out>
        __atomic_load_tmp = <optimized out>
        __atomic_load_tmp = <optimized out>
        __atomic_load_tmp = <optimized out>
        more_events = <optimized out>
        thr = 0x5653775fa520
        pfd = {pfd = {data = 0x5653775fc420, used = 3, size = 16}, loop = {data 
= 0x5653775fc4e0, used = 3, size = 16}}
#3  0x00007fba01e9a97a in start_thread () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#4  0x00007fba01f22d2c in __clone3 () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.

Thread 2 (Thread 0x7fba00dfe6c0 (LWP 857838)):
#0  0x00007fba01f1443d in poll () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#1  0x000056536f6f669e in poll (__fds=<optimized out>, __nfds=<optimized out>, 
__timeout=<optimized out>, __fds=<optimized out>, __nfds=<optimized out>, 
__timeout=<optimized out>) at 
/nix/store/gi4cz4ir3zlwhf1azqfgxqdnczfrwsr7-glibc-2.40-66-dev/include/bits/poll2.h:44
No locals.
#2  bird_thread_main (arg=0x5653775fad10) at sysdep/unix/io-loop.c:1013
        thr_loop_start = <optimized out>
        timeout = -1
        thr_before_run = <optimized out>
        idle_force = <optimized out>
        busy_now = <optimized out>
        rv = <optimized out>
        __atomic_load_ptr = <optimized out>
        __atomic_load_ptr = <optimized out>
        loop = <optimized out>
        __atomic_load_ptr = <optimized out>
        __atomic_load_ptr = <optimized out>
        __atomic_load_tmp = <optimized out>
        __atomic_load_tmp = <optimized out>
        __atomic_load_tmp = <optimized out>
        __atomic_load_tmp = <optimized out>
        more_events = <optimized out>
        thr = 0x5653775fad10
        pfd = {pfd = {data = 0x56537760dc30, used = 5, size = 16}, loop = {data 
= 0x56537760dcf0, used = 5, size = 16}}
#3  0x00007fba01e9a97a in start_thread () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#4  0x00007fba01f22d2c in __clone3 () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.

Thread 1 (Thread 0x7fba0208adc0 (LWP 857835)):
#0  0x00007fba01e9caac in __pthread_kill_implementation () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#1  0x00007fba01e4190e in raise () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#2  0x00007fba01e28942 in abort () from 
/nix/store/xx7cm72qy2c0643cm1ipngd87aqwkcdp-glibc-2.40-66/lib/libc.so.6
No symbol table info available.
#3  0x000056536f6ef97a in bug (msg=<optimized out>) at sysdep/unix/log.c:412
        args = {{gp_offset = 8, fp_offset = 48, overflow_arg_area = 
0x7fff7fe3b670, reg_save_area = 0x7fff7fe3b5b0}}
#4  0x000056536f6fa9a1 in do_lock (dg=0x5653774ace60, lsp=0x7fba0208a2a8) at 
sysdep/unix/domain.c:116
        stack_copy = {the_bird = 0x56536f7a1700 <the_bird_domain_gen.lto_priv>, 
meta = 0x0, control = 0x0, proto = 0x0, service = 0x0, rtable = 0x5653774b9140, 
attrs = 0x0, logging = 0x0, resource = 0x0}
        lll = <optimized out>
        lock_begin = <optimized out>
        duration = <optimized out>
        wdw = <optimized out>
#5  0x000056536f64c8ac in if_find_by_index (idx=23) at nest/iface.c:721
        i = <optimized out>
#6  0x000056536f6e4ac8 in sockaddr_read6 (sa=0x5653774b9140, a=0x56537750ce10, 
ifa=0x56537750cdd8, port=0x56537750ce38) at sysdep/unix/io.c:583
No locals.
#7  sockaddr_read (sa=sa@entry=0x7fff7fe3b780, af=<optimized out>, 
a=a@entry=0x56537750cd98, ifa=ifa@entry=0x56537750cdd8, 
port=port@entry=0x56537750cdc0) at sysdep/unix/io.c:595
No locals.
#8  0x000056536f6ecfd7 in sk_passive_connected (s=0x56537760f790, 
type=<optimized out>) at sysdep/unix/io.c:1451
        loc_sa = {sa = {sa_family = 10, sa_data = 
"\000\263\000\000\000\000\376\200\000\000\000\000\000"}, padding = 
"\000\000\000\000\000\0000\021\027\000\000\000SV\000"}
        rem_sa = {sa = {sa_family = 10, sa_data = 
"\263\223\000\000\000\000\376\200\000\000\000\000\000"}, padding = 
"\000\000\000\000\000\000\0254\027\000\000\000\272\000\000"}
        loc_sa_len = 28
        rem_sa_len = 28
        fd = 22
        sock_lock = <optimized out>
        t = 0x56537750cd60
#9  0x000056536f618de2 in sk_read (s=<optimized out>, revents=<optimized out>) 
at sysdep/unix/io.c:2330
        e = <optimized out>
        e = <optimized out>
#10 io_loop () at sysdep/unix/io.c:2777
        s = <optimized out>
        count = 1
        timeout = <optimized out>
        pout = <optimized out>
        poll_tout = <optimized out>
        events = <optimized out>
        t = <optimized out>
        pfd = {pfd = {data = 0x5653775f9f70, used = 5, size = 16}, loop = {data 
= 0x5653775fa030, used = 5, size = 16}}
        poll_tout = <optimized out>
        timeout = <optimized out>
        events = <optimized out>
        pout = <optimized out>
        t = <optimized out>
        pfd = <optimized out>
        next2 = <optimized out>
        count = <optimized out>
        _orig = <optimized out>
        _ptr = <optimized out>
        _ = <optimized out>
        s = <optimized out>
        e = <optimized out>
        steps = <optimized out>
        _orig = <optimized out>
        _ptr = <optimized out>
        _ = <optimized out>
        s = <optimized out>
#11 main (argc=<optimized out>, argv=<optimized out>) at sysdep/unix/main.c:1106
        use_uid = <optimized out>
        use_gid = <optimized out>
        conf = <optimized out>
(gdb) quit

Reply via email to