Summary
On a GNOME/Wayland desktop that sets QT_STYLE_OVERRIDE (a QtWidgets QStyle name, here Adwaita-Dark from adwaita-qt6), LibrePods passes that name through as the Qt Quick Controls style. There is no QML module by that name, so qrc:/linux/Main.qml never loads, the QQmlApplicationEngine ends up with no root object, and the app then dereferences it and dies with SIGSEGV.
The crash looks intermittent from the outside: a tray instance started with --hide runs fine for hours and dies the moment the tray icon is clicked, while launching from the app grid dies within a few seconds.
Environment
- LibrePods 1.0.0rc1 (Arch/CachyOS package
librepods 1.0.0rc1-1)
- Qt 6.11.2 (
qt6-base 6.11.2-2, qt6-declarative 6.11.2-1.1), adwaita-qt6 1.4.2-2
- GNOME Shell 50.4, Wayland
QT_QPA_PLATFORMTHEME=xdgdesktopportal, QT_STYLE_OVERRIDE=Adwaita-Dark
Steps to reproduce
export QT_STYLE_OVERRIDE=Adwaita-Dark (any QStyle name that is not also a Qt Quick Controls module)
- Launch
librepods
- Watch the journal, and click the tray icon
Actual behaviour
Every launch logs (note: LibrePods logs to the journal, not stderr, so a plain 2>&1 capture shows nothing):
librepods[1109873]: AirPodsTrayApp initialized
librepods[1109873]: QQmlApplicationEngine failed to load component
librepods[1109873]: qrc:/linux/Main.qml: module "Adwaita-Dark" is not installed
and then, on the next tray / D-Bus event, SIGSEGV:
Signal: 11 (SEGV) si_code: SEGV_MAPERR
Command Line: /usr/bin/librepods --hide
#0 0x000055f961ff820c n/a (librepods + 0x2820c)
#1 0x00007fe31cdeeff3 n/a (libQt6Core.so.6 + 0x1eeff3)
#2 0x00007fe31cdeeff3 n/a (libQt6Core.so.6 + 0x1eeff3)
#3 0x00007fe31efc8861 n/a (libQt6Widgets.so.6 + 0x1c8861)
#4 0x00007fe31cdef236 n/a (libQt6Core.so.6 + 0x1ef236)
#5 0x00007fe31ddbf84e n/a (libQt6Gui.so.6 + 0x7bf84e)
#6 0x00007fe31ddc0537 n/a (libQt6Gui.so.6 + 0x7c0537)
#7 0x00007fe31ed78ae9 n/a (libQt6DBus.so.6 + 0x45ae9)
...
#11 0x00007fe31cde6b96 QObject::event(QEvent*) (libQt6Core.so.6 + 0x1e6b96)
#13 0x00007fe31cd822b8 QCoreApplication::notifyInternal2(QObject*, QEvent*) (libQt6Core.so.6 + 0x1822b8)
#21 0x00007fe31cd8685a QCoreApplication::exec() (libQt6Core.so.6 + 0x18685a)
#22 0x000055f961fec0d1 main (librepods + 0x1c0d1)
(The distro binary is stripped, hence the numeric frames; the crash is in LibrePods' own code, reached from a D-Bus-delivered tray event.)
Expected behaviour
An unknown/invalid style should fall back to a valid Qt Quick Controls style, and a failed QML load should not be followed by a null dereference.
Diagnosis
QT_STYLE_OVERRIDE is a QtWidgets variable — its value is a QStyle plugin name (Adwaita-Dark, Breeze, kvantum, …), not a Qt Quick Controls module. The only Qt Quick Controls styles installed here are the ones shipped by Qt: Basic, Fusion, FluentWinUI3, Imagine, Material, Universal. Anything else fails the QML import.
Verified by varying only the environment:
| Environment |
Result |
QT_STYLE_OVERRIDE=Adwaita-Dark (session default) |
module "Adwaita-Dark" is not installed, later SIGSEGV |
QT_STYLE_OVERRIDE unset |
Main.qml loads, no crash |
QT_STYLE_OVERRIDE=Fusion |
Main.qml loads, no crash (Fusion happens to be both a QStyle and a QML module) |
QT_STYLE_OVERRIDE=Adwaita-Dark + QT_QUICK_CONTROLS_STYLE=Basic |
still fails — the explicit Qt Quick style is not honoured |
That last row is the interesting one: because the style is applied via QQuickStyle::setStyle() at runtime, it takes precedence over QT_QUICK_CONTROLS_STYLE, so users cannot work around it with the documented variable.
Suggested fix
- Don't derive the Qt Quick Controls style from
QT_STYLE_OVERRIDE / the QStyle name. If a style is chosen programmatically, validate it first, e.g. only call QQuickStyle::setStyle(name) when QQuickStyle::availableStyles().contains(name), otherwise leave Qt's own resolution alone.
- Harden the failure path regardless: connect to
QQmlApplicationEngine::objectCreationFailed (or check engine.rootObjects().isEmpty()) and bail out with an error instead of using a null root object — that is what turns a cosmetic style problem into a segfault.
Workaround for other users
Launch with the variable cleared, e.g. in ~/.local/share/applications/me.kavishdevar.librepods.desktop and ~/.config/autostart/librepods.desktop:
Exec=env -u QT_STYLE_OVERRIDE /usr/bin/librepods
Summary
On a GNOME/Wayland desktop that sets
QT_STYLE_OVERRIDE(a QtWidgets QStyle name, hereAdwaita-Darkfromadwaita-qt6), LibrePods passes that name through as the Qt Quick Controls style. There is no QML module by that name, soqrc:/linux/Main.qmlnever loads, theQQmlApplicationEngineends up with no root object, and the app then dereferences it and dies with SIGSEGV.The crash looks intermittent from the outside: a tray instance started with
--hideruns fine for hours and dies the moment the tray icon is clicked, while launching from the app grid dies within a few seconds.Environment
librepods 1.0.0rc1-1)qt6-base6.11.2-2,qt6-declarative6.11.2-1.1),adwaita-qt61.4.2-2QT_QPA_PLATFORMTHEME=xdgdesktopportal,QT_STYLE_OVERRIDE=Adwaita-DarkSteps to reproduce
export QT_STYLE_OVERRIDE=Adwaita-Dark(any QStyle name that is not also a Qt Quick Controls module)librepodsActual behaviour
Every launch logs (note: LibrePods logs to the journal, not stderr, so a plain
2>&1capture shows nothing):and then, on the next tray / D-Bus event, SIGSEGV:
(The distro binary is stripped, hence the numeric frames; the crash is in LibrePods' own code, reached from a D-Bus-delivered tray event.)
Expected behaviour
An unknown/invalid style should fall back to a valid Qt Quick Controls style, and a failed QML load should not be followed by a null dereference.
Diagnosis
QT_STYLE_OVERRIDEis a QtWidgets variable — its value is a QStyle plugin name (Adwaita-Dark,Breeze,kvantum, …), not a Qt Quick Controls module. The only Qt Quick Controls styles installed here are the ones shipped by Qt:Basic,Fusion,FluentWinUI3,Imagine,Material,Universal. Anything else fails the QML import.Verified by varying only the environment:
QT_STYLE_OVERRIDE=Adwaita-Dark(session default)module "Adwaita-Dark" is not installed, later SIGSEGVQT_STYLE_OVERRIDEunsetQT_STYLE_OVERRIDE=FusionQT_STYLE_OVERRIDE=Adwaita-Dark+QT_QUICK_CONTROLS_STYLE=BasicThat last row is the interesting one: because the style is applied via
QQuickStyle::setStyle()at runtime, it takes precedence overQT_QUICK_CONTROLS_STYLE, so users cannot work around it with the documented variable.Suggested fix
QT_STYLE_OVERRIDE/ the QStyle name. If a style is chosen programmatically, validate it first, e.g. only callQQuickStyle::setStyle(name)whenQQuickStyle::availableStyles().contains(name), otherwise leave Qt's own resolution alone.QQmlApplicationEngine::objectCreationFailed(or checkengine.rootObjects().isEmpty()) and bail out with an error instead of using a null root object — that is what turns a cosmetic style problem into a segfault.Workaround for other users
Launch with the variable cleared, e.g. in
~/.local/share/applications/me.kavishdevar.librepods.desktopand~/.config/autostart/librepods.desktop: