Package: libpulse0
Version: 16.1+dfsg1-2+b1
Severity: normal
Tags: patch fixed-upstream

(This will appear to be a pipewire bug, but in the end it looks like the 
problem is pulseaudio not closing file handles. I therefor file this bug to 
libpulse0 which I believe (no developer here) is used by the clients using 
pulseaudio.)

After my notebook is running quite a few days (suspended during nights, used 
during days) having running multiple instances of firefox and thunderbird and 
listening to music using the shortwave flatpak the sound stops working.

Shortwave shows a red 'prohibited' sign where usually would be the play button, 
pa-play can't play any sound anymore, pactl throws an error:

```
someuser@pureos:~$ pactl list
Connection failure: Connection terminated
```

Using `pw-play` or `aplay` I can still play audio files.

When looking at the open files I found that there are a few thousand memfd 
filehandles open:

```
# lsof | grep pulse | grep -v '/lib/\|/share/' | cut -c1-10,107- | sort | uniq 
-c | sort -n
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc
      Output information may be incomplete.
      1 systemd   /run/user/1000/pulse/native type=STREAM (LISTEN)
      2 pipewire- /run/user/1000/pulse/native type=STREAM (LISTEN)
      3 callaudio /memfd:pulseaudio
      3 callaudio /memfd:pulseaudio (deleted)
      7 firefox   /memfd:pulseaudio (deleted)
     10 gsd-media /memfd:pulseaudio
     10 gsd-media /memfd:pulseaudio (deleted)
     27 nheko     /memfd:pulseaudio
     27 nheko     /memfd:pulseaudio (deleted)
    128 pipewire- /run/user/1000/pulse/native type=STREAM (CONNECTED)
    176 thunderbi /memfd:pulseaudio
    184 flatpak-s /memfd:pulseaudio (deleted)
    288 virt-mana /memfd:pulseaudio (deleted)
    874 firefox-b /memfd:pulseaudio
    940 NitrokeyA /memfd:pulseaudio (deleted)
   2274 firefox-b /memfd:pulseaudio (deleted)
   2378 gnome-she /memfd:pulseaudio
   2378 gnome-she /memfd:pulseaudio (deleted)
   9680 thunderbi /memfd:pulseaudio (deleted)
```

Sometimes it helps to stop thunderbird and firefox, restart 
pipewire-pulse.socket pipewire-pulse and then try again playing sound using 
e.g. `paplay`.

Other times I have to log out and in again to get rid of the rest of the open 
files.

I configured pipewire-pulse to not offer unix:native for connections, but 
instead only tcp and made programs use that connection by configuring 
pulseaudios client.conf to disable shm and memfd and set a default-server.

This stopped the problem from occuring and no memfd entries got accumulated, 
but let to other problems (volume control, general integration into gnome).

I found the following issues that might be related to the problem:

https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1394
https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/3406

The changes following the pulseaudio issue do not seem to be integrated into 
the bookworm package, yet.

To test whether they might help I compiled built the packages I have installed 
for pulseaudio (libpulse-mainloop-glib0:amd64, libpulse0:amd64, 
libpulsedsp:amd64, pulseaudio, pulseaudio-utils) with the following patch 
applied to find out whether this would help:

```
diff -r pulseaudio-orig/pulseaudio-16.1+dfsg1/src/pulsecore/memfd-wrappers.h 
pulseaudio-patched/pulseaudio-16.1+dfsg1/src/pulsecore/memfd-wrappers.h
68a69,72
#ifndef MFD_NOEXEC_SEAL
#define MFD_NOEXEC_SEAL   0x0008U
#endif

diff -r pulseaudio-orig/pulseaudio-16.1+dfsg1/src/pulsecore/shm.c 
pulseaudio-patched/pulseaudio-16.1+dfsg1/src/pulsecore/shm.c
167c167
<         fd = memfd_create("pulseaudio", MFD_ALLOW_SEALING);
---
        fd = memfd_create("pulseaudio", MFD_ALLOW_SEALING|MFD_CLOEXEC);
```

After half a day of use I found that at least the number of open memfds 
increases and once in while decreases again. I'll have to wait for a longer 
period of time to find out whether the situation really improved.

Reply via email to