Skip to content

[Linux/AppImage] Mixed GStreamer dependencies cause plugin failures, registry pollution, and unreliable audio on Ubuntu 26.04 #2560

Description

@JoeMattie

Summary

Buzz 0.4.23's amd64 AppImage mixes older bundled libraries and WebKitGTK with Ubuntu 26.04's GStreamer 1.28.2 plugins and core libraries.

This produces three user-visible or system-visible failures:

  1. Four GStreamer plugins fail to load because host plugins resolve against incompatible libraries bundled in the AppImage.
  2. Buzz writes its random /tmp/.mount_Buzz_* plugin paths into the desktop-wide GStreamer registry, so later non-Buzz GStreamer processes try to load plugins from a stale AppImage mount.
  3. The WebKit web process continues to emit gst_caps_append criticals, and the originally failing Buzz sound remains silent, even when the three known library mismatches are worked around.

At least one Buzz notification sound did play during testing, so this is not a total failure of the host audio sink. Audio behavior is inconsistent, and the remaining silent path appears separate from the four blacklisted optional plugins.

Environment

  • Buzz: 0.4.23
  • Package: Buzz_0.4.23_amd64.AppImage
  • OS: Ubuntu 26.04 LTS
  • Kernel: 7.0.0-27-generic
  • Architecture: x86_64
  • Host GStreamer: 1.28.2

Steps to reproduce

  1. On Ubuntu 26.04, start the AppImage from a terminal:

    ./Buzz_0.4.23_amd64.AppImage
  2. Observe the initial GStreamer plugin scan.

  3. Trigger media or an in-app sound handled by the WebKit process.

  4. Quit Buzz, then run a normal host GStreamer command and inspect ~/.cache/gstreamer-1.0/registry.x86_64.bin.

Expected behavior

  • The AppImage uses one internally compatible GStreamer/WebKit dependency set.
  • No GStreamer plugins are blacklisted because of symbol or symbol-version mismatches.
  • Buzz keeps any AppImage-specific GStreamer registry separate from the user's desktop-wide registry.
  • In-app sounds play consistently.
  • The WebKit process does not emit GStreamer caps criticals.

Actual behavior

The AppImage plugin scan reports:

Failed to load plugin '.../libgstcurl.so':
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4: undefined symbol:
nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation

Failed to load plugin '.../libgstladspa.so':
/usr/lib/x86_64-linux-gnu/libcurl.so.4: undefined symbol:
nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation

Failed to load plugin '.../libgstfluidsynthmidi.so':
.../usr/lib/libxkbcommon.so.0: version `V_1.10.0' not found
(required by /usr/lib/x86_64-linux-gnu/libSDL3.so.0)

Failed to load plugin '.../libgstwebrtc.so':
/usr/lib/x86_64-linux-gnu/libgupnp-1.6.so.0: undefined symbol:
soup_server_message_pause

When media is initialized, the WebKit process reports:

WebKitWebProcess: GStreamer-CRITICAL:
gst_caps_append: assertion 'GST_IS_CAPS (caps2)' failed

The gst_caps_append critical and the originally failing sound remain after relaunching with compatible host versions of libnghttp2, libxkbcommon, and libsoup preloaded.

Confirmed packaging findings

The AppImage prepends its own library directories to LD_LIBRARY_PATH, but its GStreamer plugins are from the Ubuntu 26.04 host generation. The result is a mixed dependency graph:

Bundled library Bundled capability Host consumer that fails Compatible Ubuntu library
libnghttp2.so.14 1.43.0; required symbol absent curl 8.18.0 1.68.0; symbol present
libxkbcommon.so.0 exports only through V_1.0.0 SDL3 3.4.2 requires V_1.10.0 1.13.1; exports through V_1.12.0
libsoup-3.0.so.0 soup_server_message_pause absent GUPnP 1.6.9 3.6.6; symbol present

Additional evidence:

  • All 274 files in the AppImage's usr/lib/gstreamer-1.0/ were byte-for-byte identical to /usr/lib/x86_64-linux-gnu/gstreamer-1.0/.
  • AppImage environment: 275 plugins, 1,387 features, and four blacklisted plugins (curl, fluidsynthmidi, ladspa, and webrtc).
  • Host-only environment: 275 plugins, 1,395 features, and zero blacklisted plugins.
  • Preloading the three compatible Ubuntu libraries restores all 1,395 features and removes all four blacklist entries, but does not fix the remaining WebKit caps error or the originally failing sound.
  • A basic filesrc ! decodebin ! audioconvert ! autoaudiosink MP3 pipeline reaches PLAYING and EOS under the AppImage environment, using PulseAudio. This suggests that the remaining silent Buzz path is above the basic decoder/sink pipeline.

Shared registry contamination

AppRun.wrapped sets:

GST_PLUGIN_SYSTEM_PATH_1_0=$APPDIR/usr/lib/gstreamer-1.0:$GST_PLUGIN_SYSTEM_PATH_1_0

When GST_PLUGIN_SYSTEM_PATH_1_0 was previously unset, this replaces GStreamer's compiled-in system plugin path. Buzz then uses the shared registry at:

~/.cache/gstreamer-1.0/registry.x86_64.bin

The inspected registry contained 274 plugin entries pointing into one ephemeral /tmp/.mount_Buzz_* directory and zero entries pointing at /usr/lib. A later plain gst-launch-1.0, with no Buzz environment, attempted to load a plugin from that stale AppImage path.

Because the AppImage mount path changes on every launch, this affects other GStreamer applications and creates stale registry entries across Buzz launches.

Diagnostic workaround tested

This removes the four plugin blacklist entries and isolates Buzz from the shared registry:

GST_REGISTRY="$HOME/.cache/buzz-gstreamer-registry.bin" \
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnghttp2.so.14:/usr/lib/x86_64-linux-gnu/libxkbcommon.so.0:/usr/lib/x86_64-linux-gnu/libsoup-3.0.so.0 \
./Buzz_0.4.23_amd64.AppImage

This is only a partial workaround. The gst_caps_append critical and the originally failing in-app sound remain.

Suggested fixes

  1. Give the AppImage a private GStreamer registry via GST_REGISTRY, stored in Buzz's own data or cache directory.
  2. Do not bundle the host-identical usr/lib/gstreamer-1.0 plugin directory. If it must remain, ensure the host plugin path is preserved rather than replaced.
  3. Build and ship WebKit, GStreamer core, plugins, and transitive libraries from one compatible distribution/runtime set. At minimum, remove the stale bundled libnghttp2.so.14, libxkbcommon.so.0, and libsoup-3.0.so.0 when the compatible host libraries are intentionally used.
  4. Investigate the remaining gst_caps_append failure in the bundled WebKitGTK 4.1 media path. The AppImage appears to run an older WebKit build against Ubuntu 26.04's GStreamer 1.28 core.
  5. Consider publishing a native .deb for Ubuntu, so one coherent host dependency set is resolved by the package manager.

Open diagnostic detail

The four blacklisted plugins are not required by the basic MP3 playback pipeline, so they do not fully explain the remaining silent sound. The unresolved part of this report is the exact WebKit media caps incompatibility, not the AppImage library and registry issues above, which are independently reproducible.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions