[Bug 293382] Dead lock and kernel crash around closefp_impl

From: <bugzilla-noreply_at_freebsd.org>
Date: Mon, 30 Mar 2026 08:30:38 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=293382

--- Comment #27 from Paul <devgs@ukr.net> ---
Hi!

It seems like latest changes have reduced the likelihood of the issue. My guess
is: we are dealing with the use-after-free race and just by adding some
additional (slow? like 'stack_save()'?) code to the 'free' function, we made it
much, much less likely to occur.

But anyway, it finally happened.


Unread portion of the kernel message buffer:
panic: Assertion kn->kn_kq == kq failed at /usr/src/sys/kern/kern_event.c:2859
cpuid = 3
time = 1774857902
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe069abdfbd0
vpanic() at vpanic+0x136/frame 0xfffffe069abdfd00
panic() at panic+0x43/frame 0xfffffe069abdfd60
knote_fdclose() at knote_fdclose+0x236/frame 0xfffffe069abdfdc0
closefp_impl() at closefp_impl+0xa8/frame 0xfffffe069abdfe00
amd64_syscall() at amd64_syscall+0x169/frame 0xfffffe069abdff30
fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe069abdff30
--- syscall (6, FreeBSD ELF64, close), rip = 0x82d5be32a, rsp = 0x85b519b98,
rbp = 0x85b519bb0 ---
KDB: enter: panic


(kgdb) bt
#0  __curthread () at /usr/src/sys/amd64/include/pcpu_aux.h:57
#1  doadump (textdump=0) at /usr/src/sys/kern/kern_shutdown.c:399
#2  0xffffffff804b60a8 in db_fncall_generic (nargs=0, args=0xfffffe069abdf5f0,
addr=<optimized out>, rv=<optimized out>) at /usr/src/sys/ddb/db_command.c:631
#3  db_fncall (dummy1=<optimized out>, dummy2=<optimized out>,
dummy3=<optimized out>, dummy4=<optimized out>) at
/usr/src/sys/ddb/db_command.c:679
#4  0xffffffff804b5b2d in db_command (last_cmdp=<optimized out>,
cmd_table=<optimized out>, dopager=false) at /usr/src/sys/ddb/db_command.c:508
#5  0xffffffff804b5c76 in db_command_script
(command=command@entry=0xffffffff81bd7722 <db_recursion_data+18> "call
doadump") at /usr/src/sys/ddb/db_command.c:573
#6  0xffffffff804bba58 in db_script_exec
(scriptname=scriptname@entry=0xfffffe069abdf7c0 "kdb.enter.panic",
warnifnotfound=warnifnotfound@entry=0) at /usr/src/sys/ddb/db_script.c:301
#7  0xffffffff804bb952 in db_script_kdbenter (eventname=<optimized out>) at
/usr/src/sys/ddb/db_script.c:323
#8  0xffffffff804b91e1 in db_trap (type=<optimized out>, code=<optimized out>)
at /usr/src/sys/ddb/db_main.c:266
#9  0xffffffff80c1d01f in kdb_trap (type=type@entry=3, code=code@entry=0,
tf=tf@entry=0xfffffe069abdfb10) at /usr/src/sys/kern/subr_kdb.c:790
#10 0xffffffff8112a96d in trap (frame=<optimized out>) at
/usr/src/sys/amd64/amd64/trap.c:675
#11 <signal handler called>
#12 kdb_enter (why=<optimized out>, msg=<optimized out>) at
/usr/src/sys/kern/subr_kdb.c:556
#13 0xffffffff80bc9f9b in vpanic (fmt=0xffffffff812ec6bb "Assertion %s failed
at %s:%d", ap=ap@entry=0xfffffe069abdfd40) at
/usr/src/sys/kern/kern_shutdown.c:962
#14 0xffffffff80bc9e03 in panic (fmt=0xffffffff81da2290 <cnputs_mtx>
"\254\214!\201\377\377\377\377") at /usr/src/sys/kern/kern_shutdown.c:887
#15 0xffffffff80b6bd26 in knote_fdclose (td=td@entry=0xff0100026dc5d780,
fd=fd@entry=544408) at /usr/src/sys/kern/kern_event.c:2859
#16 0xffffffff80b63468 in closefp_impl (fdp=0xfffffe02c31fec90, fd=544408,
fp=0xff01002710a27640, td=0xff0100026dc5d780, audit=true) at
/usr/src/sys/kern/kern_descrip.c:1413
#17 0xffffffff8112b739 in syscallenter (td=0xff0100026dc5d780) at
/usr/src/sys/amd64/amd64/../../kern/subr_syscall.c:193
#18 amd64_syscall (td=0xff0100026dc5d780, traced=0) at
/usr/src/sys/amd64/amd64/trap.c:1244
#19 <signal handler called>
#20 0x000000082d5be32a in ?? ()
Backtrace stopped: Cannot access memory at address 0x85b519b98
(kgdb) fr 15
#15 0xffffffff80b6bd26 in knote_fdclose (td=td@entry=0xff0100026dc5d780,
fd=fd@entry=544408) at /usr/src/sys/kern/kern_event.c:2859
2859                            MPASS(kn->kn_kq == kq);
(kgdb) p *((struct kqueue*)$r15)
$11 = {
  kq_lock = {
    lock_object = {
      lo_name = 0xffffffff8133f15f "kqueue",
      lo_flags = 21168128,
      lo_data = 0,
      lo_witness = 0xff0100804bd8db80
    },
    mtx_lock = 18374967965079951232
  },
  kq_refcnt = 0,
  kq_list = {
    tqe_next = 0xff0100010ac21b00,
    tqe_prev = 0xff010002a0adb128
  },
  kq_head = {
    tqh_first = 0x0,
    tqh_last = 0xff0100010aac4b38
  },
  kq_count = 0,
  kq_sel = {
    si_tdlist = {
      tqh_first = 0x0,
      tqh_last = 0x0
    },
    si_note = {
      kl_list = {
        slh_first = 0x0
      },
      kl_lock = 0xffffffff80b6b420 <knlist_mtx_lock>,
      kl_unlock = 0xffffffff80b6b440 <knlist_mtx_unlock>,
      kl_assert_lock = 0xffffffff80b6b460 <knlist_mtx_assert_lock>,
      kl_lockarg = 0xff0100010aac4b00,
      kl_autodestroy = 0
    },
    si_mtx = 0x0
  },
  kq_sigio = 0x0,
  kq_fdp = 0xfffffe02c31fec90,
  kq_state = 0,
  kq_knlistsize = 685056,
  kq_knlist = 0xfffffe0bbf526000,
  kq_knhashmask = 0,
  kq_knhash = 0x0,
  kq_task = {
    ta_link = {
      stqe_next = 0x0
    },
    ta_pending = 0,
    ta_priority = 0 '\000',
    ta_flags = 0 '\000',
    ta_func = 0xffffffff80b6dd00 <kqueue_task>,
    ta_context = 0xff0100010aac4b00
  },
  kq_cred = 0xff0100010a9eb600,
  kq_forksrc = 0x0
}

(kgdb) p *((struct eknote*)kn)
$3 = {
  k = {
    kn_link = {
      sle_next = 0xdededededededede
    },
    kn_selnext = {
      sle_next = 0xdededededededede
    },
    kn_knlist = 0xdededededededede,
    kn_tqe = {
      tqe_next = 0xdededededededede,
      tqe_prev = 0xdededededededede
    },
    kn_kq = 0xdededededededede,
    kn_kevent = {
      ident = 16059518370053021406,
      filter = -8482,
      flags = 57054,
      fflags = 3739147998,
      data = -2387225703656530210,
      udata = 0xdededededededede,
      ext = {16059518370053021406, 16059518370053021406, 16059518370053021406,
16059518370053021406}
    },
    kn_hook = 0xdededededededede,
    kn_hookid = -555819298,
    kn_status = -555819298,
    kn_influx = -555819298,
    kn_sfflags = 3739147998,
    kn_sdata = -2387225703656530210,
    kn_ptr = {
      p_fp = 0xdededededededede,
      p_proc = 0xdededededededede,
      p_aio = 0xdededededededede,
      p_lio = 0xdededededededede,
      p_prison = 0xdededededededede,
      p_v = 0xdededededededede
    },
    kn_fop = 0xdededededededede
  },
  c = {
    kn_link = {
      sle_next = 0x0
    },
    kn_selnext = {
      sle_next = 0xffffffffffffffff
    },
    kn_knlist = 0x0,
    kn_tqe = {
      tqe_next = 0xffffffffffffffff,
      tqe_prev = 0xffffffffffffffff
    },
    kn_kq = 0xff0100010aac4b00,
    kn_kevent = {
      ident = 138904,
      filter = -1,
      flags = 32,
      fflags = 0,
      data = 0,
      udata = 0xdda7cbe67c0,
      ext = {0, 0, 0, 0}
    },
    kn_hook = 0x0,
    kn_hookid = 0,
    kn_status = 8,
    kn_influx = 1,
    kn_sfflags = 0,
    kn_sdata = 0,
    kn_ptr = {
      p_fp = 0x0,
      p_proc = 0x0,
      p_aio = 0x0,
      p_lio = 0x0,
      p_prison = 0x0,
      p_v = 0x0
    },
    kn_fop = 0x0
  },
  s = {
    depth = 5,
    pcs = {18446744071574043258, 18446744071574043755, 18446744071574008936,
18446744071580071737, 18446744071579870491, 0 <repeats 13 times>}
  }
}
(kgdb) p (void*)18446744071574043258
$4 = (void *) 0xffffffff80b6ba7a <knote_drop_detached+554>
(kgdb) p (void*)18446744071574043755
$5 = (void *) 0xffffffff80b6bc6b <knote_fdclose+379>
(kgdb) p (void*)18446744071574008936
$6 = (void *) 0xffffffff80b63468 <closefp_impl+168>
(kgdb) p (void*)18446744071580071737
$7 = (void *) 0xffffffff8112b739 <amd64_syscall+361>
(kgdb) p (void*)18446744071579870491
$8 = (void *) 0xffffffff810fa51b <fast_syscall_common+248>


Please, tell us if you need anything else.

-- 
You are receiving this mail because:
You are the assignee for the bug.