bus: Escape environment-based D-Bus addresses properly

If XDG_RUNTIME_DIR contains a character like ":" (for instance if it's
formed from an X11 display name), then it isn't valid to substitute
it into a D-Bus address without escaping.

http://bugs.freedesktop.org/show_bug.cgi?id=60499
This commit is contained in:
Simon McVittie
2013-03-06 17:23:49 +01:00
committed by Lennart Poettering
parent f1324eaa68
commit 92f3034958
+18 -3
View File
@@ -1077,18 +1077,33 @@ static int bus_init_private(Manager *m) {
} else {
const char *e;
char *p;
char *escaped;
e = secure_getenv("XDG_RUNTIME_DIR");
if (!e)
return 0;
if (asprintf(&p, "unix:path=%s/systemd/private", e) < 0) {
if (asprintf(&p, "%s/systemd/private", e) < 0) {
r = log_oom();
goto fail;
}
mkdir_parents_label(p+10, 0755);
unlink(p+10);
mkdir_parents_label(p, 0755);
unlink(p);
free(p);
escaped = dbus_address_escape_value(e);
if (!escaped) {
r = log_oom();
goto fail;
}
if (asprintf(&p, "unix:path=%s/systemd/private", escaped) < 0) {
dbus_free(escaped);
r = log_oom();
goto fail;
}
dbus_free(escaped);
m->private_bus = dbus_server_listen(p, &error);
free(p);
}