mirror of
https://github.com/games-on-whales/wolf.git
synced 2026-10-15 21:12:08 +00:00
[GH-ISSUE #518] Leaving a lobby can leak every frame until Wolf is OOM-killed (gst-interpipe use-after-free) #314
Labels
No labels
🧠 1 - 🤖 999
AMD
bug
bug
cannot reproduce
documentation
duplicate
easy
enhancement
enhancement
enhancement
fixed?
fixed?
good first issue
hard
help wanted
Intel
invalid
LXC
medium
moonlight-protocol
Multi GPU
nixos
not a bug
nvidia
pull-request
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
games-on-whales/wolf#314
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @gorylpe on GitHub (Sep 30, 2026).
Original GitHub issue: https://github.com/games-on-whales/wolf/issues/518
When a stream leaves a lobby while the game keeps running, Wolf's memory can grow by ~500 MB/s until the OOM killer takes it out, with
gst_inter_pipe_ilistener_push_buffer: assertion 'GST_INTER_PIPE_IS_ILISTENER (self)' failedflooding the log. Rejoining that lobby then shows a frozen picture. The bug is in gst-interpipe; fix: games-on-whales/gst-interpipe#3Setup
ghcr.io/games-on-whales/wolf:stable(a1edc1b), GStreamer 1.26.7, NVIDIA RTX 2080 SUPER,WOLF_USE_ZERO_COPY=FALSE, in a Proxmox LXCSteps
3 out of 3 times with moonlight-web. The desktop client's Ctrl+Alt+Shift+Q didn't trigger it, and neither does moonlight-web's Exit button.
Log
In another run: 1.1 GiB → 6.5 GiB in 11 s. Memory already lost stays lost until Wolf restarts; stopping the empty lobby through the API stops the growth.
What happens
leave_lobby()switches the stream'sinterpipesrcback to the session's own node while the stream's pipelines are going to EOS, and here the session's Wolf UI producer is being stopped at the same moment. The switch fails (Failed to reconfigure), and gst-interpipe's fallback leaves its global listeners table and the lobby node's table out of step. The lobby'sinterpipesinkkeeps the source after it's freed, so every frame is pushed to freed memory and the buffer ref taken for it is never released. On resume the new source has the same name,add_listener()keeps the stale entry as "already registered", and the new stream gets no frames.The desktop client's quit is a clean pause, the Wolf UI producer stays up and the switch back succeeds. Closing a moonlight-web tab drops the connection late (when its WebRTC peer times out), which lands in the window.
With the fix
Same Wolf image, only
libgstinterpipe.sorebuilt from the PR branch: leaving logsDropping listener …, freed while still registered, no assertion flood, memory stays flat, and rejoining the lobby from Wolf UI works.To try it before a new image:
Possibly related: #364 (same assertion, but when sessions join a shared lobby).