block / block/buzz

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

Open
#2,560 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
Rust
Stars
32.7k
Forks
4.3k
Avg merge
1d 13h
Merged PRs (30d)
253

Description

## 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:

```bash
./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:

```text
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:

```text
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:

```bash
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:

```text
~/.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:

```bash
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.

Contributor guide

Open the contributing guide

Research direction

Reproduce the AppImage launch and inspect AppRun.wrapped, the usr/lib/gstreamer-1.0 directory, and the shared registry at ~/.cache/gstreamer-1.0/registry.x86_64.bin. Compare the bundled and host plugin paths and investigate the bundled WebKitGTK 4.1 media path, including the gst_caps_append error and silent sound. Done means Buzz no longer contaminates the shared registry, uses a coherent dependency set, and the remaining media failures are resolved.

Written by the indexing model from the issue text.

Assessment

Tech stack
linux
Domain
audio-video-rtc, build-system
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.