Skip to content

Segfault in epoll_fd_state_del() on Linux – daemon crashes when deleting knotes #168

@softov

Description

@softov

I have an existing codebase that runs cleanly on FreeBSD using native kqueue.
Due to deployment requirements I’m now running the same software on Linux (using libkqueue).

After minimal porting changes, most things work, but one of my daemons repeatedly crashes due to a SIGSEGV during knote deletion.

Now I'm running the last codebase, compiled manually.

Running using gdb it gives this error.

epoll_fd_state_del (fds_p=fds_p@entry=0x7fffffffe1b8, kn=kn@entry=0x5555556440a0, ev=<optimized out>) at /usr/brbyte/libkqueue/src/linux/platform.c:1369
1369    /usr/brbyte/libkqueue/src/linux/platform.c: No such file or directory.
(gdb) bt
#0  epoll_fd_state_del (fds_p=fds_p@entry=0x7fffffffe1b8, kn=kn@entry=0x5555556440a0, ev=<optimized out>) at /usr/brbyte/libkqueue/src/linux/platform.c:1369
#1  0x00007ffff7be836c in epoll_update (op=<optimized out>, filt=<optimized out>, kn=0x5555556440a0, ev=<optimized out>, delete=<optimized out>) at /usr/brbyte/libkqueue/src/linux/platform.c:1564
#2  0x00007ffff7be577a in knote_delete (filt=0x5555555cb818, kn=kn@entry=0x5555556440a0) at /usr/brbyte/libkqueue/src/common/knote.c:149
#3  0x00007ffff7be4a95 in kevent_copyin_one (src=0x7ffff54f8050, kq=0x5555555cb800, out=<synthetic pointer>) at /usr/brbyte/libkqueue/src/common/kevent.c:235
#4  kevent_copyin (nevents=512, eventlist=<optimized out>, nchanges=4, changelist=0x7ffff54f8010, kq=0x5555555cb800) at /usr/brbyte/libkqueue/src/common/kevent.c:284
#5  kevent (kqfd=<optimized out>, changelist=0x7ffff54f8010, nchanges=4, eventlist=0x7ffff5519010, nevents=512, timeout=timeout@entry=0x5555555cf028)
    at /usr/brbyte/libkqueue/src/common/kevent.c:423
#6  0x00007ffff7c9f47c in EvKQBaseKEventInvoke (kq_base=0x5555555cd950) at event/core/ev_kq_base.c:1906
#7  EvKQInvokeKQueueOnce (kq_base=kq_base@entry=0x5555555cd950, timeout_ms=<optimized out>) at event/core/ev_kq_base.c:339
#8  0x00007ffff7c9fea4 in EvKQBaseDispatchOnce (kq_base=kq_base@entry=0x5555555cd950, timeout_ms=timeout_ms@entry=100) at event/core/ev_kq_base.c:226
#9  0x00007ffff7ca013c in EvKQBaseDispatch (kq_base=0x5555555cd950, timeout_ms=timeout_ms@entry=100) at event/core/ev_kq_base.c:311
#10 0x000055555555a13c in main (argc=<optimized out>, argv=<optimized out>) at web_authd.c:103
(gdb)

Something in Linux that can cause this? All the time I see this the nevents is 512. Is this related with MAX_KEVENT? Is there some guidance? To test, to change, to share in the code...

Most of the code I use in my base is in https://github.com/BrByte/brb_framework/tree/master/libbrb_core/event/core

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions