summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-06-24 22:55:39 +0200
committerLennart Poettering <lennart@poettering.net>2011-06-24 22:55:39 +0200
commit21c390ccd1b4f7bc962c16549df929ad518a1d37 (patch)
tree68458572b17f28cd20ea560216f0eea668cefddc
parent0771475394887e3635e67196fa6f56486fa2126c (diff)
logind: properly handle if two session with identical loginuids are attempted to be created
-rw-r--r--src/logind-dbus.c50
-rw-r--r--src/logind.h1
-rw-r--r--src/pam-module.c10
3 files changed, 53 insertions, 8 deletions
diff --git a/src/logind-dbus.c b/src/logind-dbus.c
index 2bad549fc5..d48d68c2bb 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 {
diff --git a/src/logind.h b/src/logind.h
index 2b9b702f3d..d8674e7511 100644
--- a/src/logind.h
+++ b/src/logind.h
@@ -40,7 +40,6 @@
* subscribe to fd HUP
* D-Bus method: AttachDevice(seat, device);
* D-Bus method: PermitLinger(user, bool b);
- * properly handle if two sessions with the same loginuid are attempted to be created
*
* non-local X11 server
* reboot/shutdown halt management
diff --git a/src/pam-module.c b/src/pam-module.c
index dc7c00166e..eba59f65f2 100644
--- a/src/pam-module.c
+++ b/src/pam-module.c
@@ -457,10 +457,12 @@ _public_ PAM_EXTERN int pam_sm_open_session(
goto finish;
}
- r = pam_set_data(handle, "systemd.session-fd", INT_TO_PTR(session_fd+1), NULL);
- if (r != PAM_SUCCESS) {
- pam_syslog(handle, LOG_ERR, "Failed to install session fd.");
- return r;
+ if (session_fd >= 0) {
+ r = pam_set_data(handle, "systemd.session-fd", INT_TO_PTR(session_fd+1), NULL);
+ if (r != PAM_SUCCESS) {
+ pam_syslog(handle, LOG_ERR, "Failed to install session fd.");
+ return r;
+ }
}
session_fd = -1;