[pulseaudio-discuss] [PATCH] core-util: Blame systemd for not setting up XDG_RUNTIME_DIR correctly

David Henningsson david.henningsson at canonical.com
Mon Nov 11 22:52:48 PST 2013

Hi Lennart,

I think you're wrong about this bug:

You're claiming that PA will only work if XDG_RUNTIME_DIR remains the same
as the original user. However, PA will use the PULSE_SERVER X11 property instead of
using XDG_RUNTIME_DIR, so this environment variable does not matter. Usually.

If this property is not available, or if one is using the pacmd cli protocol,
the client will go ahead and call pa_make_secure_dir on XDG_RUNTIME_DIR/pulse.
This will either fail (if you're another regular user), or succeed (if you're root).
Both scenarios are bad - failing will cause the connection to fail, and succeeding
is even worse, as it can cause *other* connections to fail (as the directory
ownership has changed).

Long story short, inserting the original user's XDG_RUNTIME_DIR does not help PA
in any use case I can think of - it only makes things worse.

Until this behaviour is changed, I suggest PulseAudio defend itself against
this bug using the patch below.

BugLink: https://bugs.launchpad.net/bugs/1197395
Signed-off-by: David Henningsson <david.henningsson at canonical.com>
 src/pulsecore/core-util.c |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index e925918..f8d01e0 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -1758,6 +1758,14 @@ char *pa_get_runtime_dir(void) {
     /* Use the XDG standard for the runtime directory. */
     d = getenv("XDG_RUNTIME_DIR");
     if (d) {
+        struct stat st;
+        if (stat(d, &st) == 0 && st.st_uid != getuid()) {
+            pa_log("XDG_RUNTIME_DIR (%s) is not owned by us (uid %d), but by uid %d.\n"
+                   "Most likely this is a bug in systemd. Please report this issue to the SYSTEMD developers.",
+                   d, getuid(), st.st_uid);
+            goto fail;
+        }
         k = pa_sprintf_malloc("%s" PA_PATH_SEP "pulse", d);
         if (pa_make_secure_dir(k, m, (uid_t) -1, (gid_t) -1, true) < 0) {

More information about the pulseaudio-discuss mailing list