Public bug reported:

Analysis of /var/crash/_usr_bin_wireplumber.108.crash (moved to ~)
Date of crash: Tue Sep 8 18:25:51 2026 | Ubuntu 26.04 (Resolute)
wireplumber 0.5.13-1ubuntu1, glib2.0 2.88.0-1, pipewire 1.6.2-1ubuntu1.1
Process: /usr/bin/wireplumber, uid 108 (lightdm session), ProcCwd 
/var/lib/lightdm
Signal: 6 (SIGABRT) - GLib consistency assertion, NOT memory corruption
(wireplumber was EXITING normally when this fired - crash is on the shutdown 
path)

=== What happened (verified against the embedded core dump) ===

main (main.c:180) -> daemon_clear (main.c:54) unrefs WpCore at daemon exit
 -> wp_core_dispose -> wp_registry_clear unrefs all plugins
 -> WpLuaScriptingPlugin deactivate -> lua_close() runs Lua GC finalizers
 -> _wplua_gvalue_userdata___gc (wplua/userdata.c:99) drops a GValue holding
    the LAST reference to the WpModemManager plugin. That GValue came from the
    global Lua variable `mm = Plugin.find("modem-manager")` in
    src/scripts/device/find-voice-call-profile.lua:22
 -> WpModemManager dispose -> wp_plugin_deactivate -> wp_modem_manager_disable
    (module-modem-manager.c:385) -> g_clear_object(&wpmm->dbus)
 -> drops LAST reference to the WpDBusConnection plugin 
("system-dbus-connection")
 -> WpDBusConnection dispose -> closure_array_destroy_all() invalidates the
    GClosure created at modules/module-dbus-connection.c:85:
        g_signal_connect_object(self->connection, "closed",
            G_CALLBACK(on_connection_closed), self, 0);
 -> g_closure_invalidate fires the closure's invalidate notifiers. The closure's
    notifier array holds TWO (GDBusConnection, invalid_closure_notify) entries
    while the GDBusConnection instance (0x570c9aa50660) is already finalized
    (ref_count == 0, removed from glib's handler registry).
 -> First notifier consumes the last leftover handler entry and removes the dead
    connection's handler-list entry; second notifier finds handler == NULL and
    hits g_assert(handler != NULL) in invalid_closure_notify (gsignal.c:4110)
 -> g_assertion_message_expr: 'assertion failed: (handler != NULL)' -> abort()

=== Root cause ===

Signal-handler bookkeeping desync in glib 2.88.0 involving
g_signal_connect_object() (its g_object_watch_closure-based implementation):
stale invalidate-notifier entries remained in the closure after the signal
instance (GDBusConnection) was destroyed earlier in the shutdown cascade
(instance destroyed before the watching object - the hazardous lifetime
ordering for g_signal_connect_object). When the watcher object is later
disposed and invalidates the closure, GLib trips its own consistency assert.

Contributing factor in wireplumber: shutdown order lets a Lua global hold the
last reference to the modem-manager plugin, so dbus-plugin teardown runs deep
inside Lua GC finalization.

=== Impact ===

Exit-path only: wireplumber has already finished its work when it crashes
(session logout / greeter shutdown under LightDM). No in-session audio impact.
Consequences are noise: /var/crash entries, journald errors, systemd may mark
the stop as failed.

=== Suggested handling ===

1. No existing Launchpad bug for this in wireplumber, and no matching GLib or
   WirePlumber upstream report exists -> worth reporting: `ubuntu-bug 
wireplumber`
   (attach backtrace.txt and this analysis). The core file is decodable via the
   steps below.
2. Keep glib2.0/wireplumber updated; this bug class is typically fixed in GLib
   point releases. At crash time glibc was 2.43-2ubuntu2.3 (since upgraded).
3. Not worth working around on a normal desktop - but on modem-less systems the
   whole chain disappears if modem-manager integration is disabled via
   wireplumber component overrides.

=== How the backtrace was decoded (for the bug report) ===

- The .crash file's CoreDump section: per-line base64 (128 KiB chunks, leading
  space per line), zstd-compressed ELF core.
- System libs (libc6 2.43-2ubuntu2.3, libm, ld) had been upgraded after the
  crash; exact-matching copies were fetched from Launchpad by build-id and put
  in a sysroot (core's expected libc build-id: 
240c8909736b31f963346aca80667fd00c551e32).
- Debug symbols from ddebs.ubuntu.com (wireplumber, libwireplumber-0.5-0,
  libglib2.0-0t64, liblua5.4-0, libc6-dbg) matched by build-id.
- gdb -iex "set sysroot <sysroot>" -iex "set debug-file-directory 
<sysroot>/usr/lib/debug"
  /usr/bin/wireplumber core  -> backtrace.txt


#0  __pthread_kill_implementation (threadid=<optimized out>, signo=6, no_tid=0) 
at ./nptl/pthread_kill.c:44
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=6, no_tid=0) 
at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (threadid=<optimized out>, signo=6) at 
./nptl/pthread_kill.c:89
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at 
./nptl/pthread_kill.c:100
#3  0x000070a478445b7e in __GI_raise (sig=sig@entry=6) at 
../sysdeps/posix/raise.c:26
#4  0x000070a4784288ec in __GI_abort () at ./stdlib/abort.c:77
#5  0x000070a4787c7138 in g_assertion_message 
(domain=domain@entry=0x70a478945015 "GLib-GObject", 
file=file@entry=0x70a478948257 "../../../gobject/gsignal.c", 
line=line@entry=4110, func=func@entry=0x70a478950d10 <__func__.24> 
"invalid_closure_notify", message=message@entry=0x570c9aa49670 "assertion 
failed: (handler != NULL)") at ../../../glib/gtestutils.c:3478
#6  0x000070a4788383f7 in g_assertion_message_expr 
(domain=domain@entry=0x70a478945015 "GLib-GObject", 
file=file@entry=0x70a478948257 "../../../gobject/gsignal.c", 
line=line@entry=4110, func=func@entry=0x70a478950d10 <__func__.24> 
"invalid_closure_notify", expr=expr@entry=0x70a478947c66 "handler != NULL") at 
../../../glib/gtestutils.c:3504
#7  0x000070a47892bf2c in invalid_closure_notify (instance=0x570c9aa50660, 
closure=0x570c9aa3f150) at ../../../gobject/gsignal.c:4110
#8  0x000070a478914124 in closure_invoke_notifiers (notify_type=<optimized 
out>, closure=0x570c9aa3f150) at ../../../gobject/gclosure.c:308
#9  closure_invoke_notifiers (closure=0x570c9aa3f150, notify_type=1) at 
../../../gobject/gclosure.c:260
#10 closure_invalidate_internal (closure=0x570c9aa3f150) at 
../../../gobject/gclosure.c:633
#11 g_closure_invalidate (closure=0x570c9aa3f150) at 
../../../gobject/gclosure.c:667
#12 0x000070a478924552 in closure_array_destroy_all (object=0x570c9aa2c370) at 
../../../gobject/gobject.c:5702
#13 0x000070a478924685 in g_object_unref (_object=0x570c9aa2c370) at 
../../../gobject/gobject.c:4839
#14 0x000070a4789a2fd1 in wp_plugin_deactivate (features=<optimized out>, 
object=<optimized out>) at ../lib/wp/plugin.c:144
#15 wp_plugin_deactivate (object=<optimized out>, features=<optimized out>) at 
../lib/wp/plugin.c:138
#16 0x000070a4789a190a in wp_object_dispose (object=0x570c9aa3e970) at 
../lib/wp/object.c:191
#17 0x000070a478924685 in g_object_unref (_object=0x570c9aa3e970) at 
../../../gobject/gobject.c:4839
#18 0x000070a478940e87 in g_value_unset (value=value@entry=0x570c9aa42f78) at 
../../../gobject/gvalue.c:213
#19 0x000070a476041c93 in _wplua_gvalue_userdata___gc (L=<optimized out>) at 
../modules/module-lua-scripting/wplua/userdata.c:99
#20 0x000070a475fc62fd in precallC (L=0x570c9a9c4c38, func=<optimized out>, 
nresults=0, f=<optimized out>) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/ldo.c:536
#21 luaD_precall (L=L@entry=0x570c9a9c4c38, func=<optimized out>, 
nresults=nresults@entry=0) at /build/lua5.4-zF06vE/lua5.4-5.4.8/src/ldo.c:602
#22 0x000070a475fc8dc9 in ccall (L=0x570c9a9c4c38, func=<optimized out>, 
nResults=0, inc=65537) at /build/lua5.4-zF06vE/lua5.4-5.4.8/src/ldo.c:642
#23 luaD_callnoyield (L=0x570c9a9c4c38, func=<optimized out>, nResults=0) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/ldo.c:662
#24 dothecall (L=L@entry=0x570c9a9c4c38, ud=ud@entry=0x0) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/lgc.c:903
#25 0x000070a475fc0d95 in luaD_rawrunprotected (L=L@entry=0x570c9a9c4c38, 
f=f@entry=0x70a475fc8d90 <dothecall>, ud=ud@entry=0x0) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/ldo.c:141
#26 0x000070a475fc10f0 in luaD_pcall (L=L@entry=0x570c9a9c4c38, 
func=func@entry=0x70a475fc8d90 <dothecall>, u=u@entry=0x0, old_top=16, 
ef=ef@entry=0) at /build/lua5.4-zF06vE/lua5.4-5.4.8/src/ldo.c:964
#27 0x000070a475fc1302 in GCTM (L=L@entry=0x570c9a9c4c38) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/lgc.c:923
#28 0x000070a475fc4dc8 in callallpendingfinalizers (L=0x570c9a9c4c38) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/lgc.c:953
#29 luaC_freeallobjects (L=0x570c9a9c4c38) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/lgc.c:1517
#30 0x000070a475fcab40 in close_state (L=0x570c9a9c4c38) at 
/build/lua5.4-zF06vE/lua5.4-5.4.8/src/lstate.c:278
#31 0x000070a4789a2fd1 in wp_plugin_deactivate (features=<optimized out>, 
object=<optimized out>) at ../lib/wp/plugin.c:144
#32 wp_plugin_deactivate (object=<optimized out>, features=<optimized out>) at 
../lib/wp/plugin.c:138
#33 0x000070a4789a190a in wp_object_dispose (object=0x570c9a9bdd50) at 
../lib/wp/object.c:191
#34 0x000070a478924685 in g_object_unref (_object=_object@entry=0x570c9a9bdd50) 
at ../../../gobject/gobject.c:4839
#35 0x000070a47898c471 in glib_autoptr_clear_GObject (_ptr=0x570c9a9bdd50) at 
/usr/include/glib-2.0/gobject/gobject-autocleanups.h:31
#36 glib_autoptr_cleanup_GObject (_ptr=<synthetic pointer>) at 
/usr/include/glib-2.0/gobject/gobject-autocleanups.h:31
#37 wp_registry_clear (self=0x570c9a959768) at ../lib/wp/private/registry.c:176
#38 wp_core_dispose (obj=0x570c9a9596c0) at ../lib/wp/core.c:401
#39 0x000070a478924685 in g_object_unref (_object=0x570c9a9596c0) at 
../../../gobject/gobject.c:4839
#40 0x0000570c7fa959cb in daemon_clear (self=0x7ffc94ce6d90) at ../src/main.c:54
#41 glib_auto_cleanup_WpDaemon (_ptr=0x7ffc94ce6d90) at ../src/main.c:57
#42 main (argc=<optimized out>, argv=<optimized out>) at ../src/main.c:180

ProblemType: Bug
DistroRelease: Ubuntu 26.04
Package: wireplumber 0.5.13-1ubuntu1
ProcVersionSignature: Ubuntu 7.0.0-31.31-generic 7.0.14
Uname: Linux 7.0.0-31-generic x86_64
NonfreeKernelModules: nvidia_modeset nvidia
ApportVersion: 2.34.1-0ubuntu0.1
Architecture: amd64
CasperMD5CheckResult: unknown
CurrentDesktop: XFCE
Date: Fri Sep 11 11:37:44 2026
InstallationDate: Installed on 2025-07-13 (425 days ago)
InstallationMedia: Xubuntu 24.04.2 LTS "Noble Numbat" - Release amd64 
(20250215.1)
ProcEnviron:
 LANG=en_US.UTF-8
 PATH=(custom, no user)
 SHELL=/bin/bash
 TERM=xterm-256color
 XDG_RUNTIME_DIR=<set>
SourcePackage: wireplumber
UpgradeStatus: Upgraded to resolute on 2026-05-10 (124 days ago)

** Affects: wireplumber (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: amd64 apport-bug resolute

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2167080

Title:
  SIGABRT — GLib's own consistency assert — during normal wireplumber
  shutdown

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/wireplumber/+bug/2167080/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to