X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind-dbus.c;h=d48d68c2bb70b4b64d5bdd3fc63c7a54dc43e134;hb=21c390ccd1b4f7bc962c16549df929ad518a1d37;hp=2bad549fc528a60e49eda77ec1027cfda8d4e32e;hpb=0771475394887e3635e67196fa6f56486fa2126c;p=elogind.git diff --git a/src/logind-dbus.c b/src/logind-dbus.c index 2bad549fc..d48d68c2b 100644 --- a/src/logind-dbus.c +++ b/src/logind-dbus.c @@ -314,9 +314,53 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess goto fail; } - if (hashmap_get(m->sessions, id)) { - r = -EEXIST; - goto fail; + session = hashmap_get(m->sessions, id); + + if (session) { + + /* Session already exists, client is probably + * something like "su" which changes uid but + * is still the same audit session */ + + reply = dbus_message_new_method_return(message); + if (!reply) { + r = -ENOMEM; + goto fail; + } + + /* Create a throw-away fd */ + if (pipe(pipe_fds) < 0) { + r = -errno; + goto fail; + } + + close_nointr_nofail(pipe_fds[0]); + pipe_fds[0] = -1; + + p = session_bus_path(session); + if (!p) { + r = -ENOMEM; + goto fail; + } + + b = dbus_message_append_args( + reply, + DBUS_TYPE_STRING, &session->id, + DBUS_TYPE_OBJECT_PATH, &p, + DBUS_TYPE_STRING, &session->user->runtime_path, + DBUS_TYPE_UNIX_FD, &pipe_fds[1], + DBUS_TYPE_INVALID); + free(p); + + if (!b) { + r = -ENOMEM; + goto fail; + } + + close_nointr_nofail(pipe_fds[1]); + *_reply = reply; + + return 0; } } else {