mirror of
https://github.com/systemd/systemd.git
synced 2024-11-06 08:26:52 +03:00
logind: properly handle if two session with identical loginuids are attempted to be created
This commit is contained in:
parent
0771475394
commit
21c390ccd1
@ -314,9 +314,53 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hashmap_get(m->sessions, id)) {
|
session = hashmap_get(m->sessions, id);
|
||||||
r = -EEXIST;
|
|
||||||
goto fail;
|
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 {
|
} else {
|
||||||
|
@ -40,7 +40,6 @@
|
|||||||
* subscribe to fd HUP
|
* subscribe to fd HUP
|
||||||
* D-Bus method: AttachDevice(seat, device);
|
* D-Bus method: AttachDevice(seat, device);
|
||||||
* D-Bus method: PermitLinger(user, bool b);
|
* 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
|
* non-local X11 server
|
||||||
* reboot/shutdown halt management
|
* reboot/shutdown halt management
|
||||||
|
@ -457,10 +457,12 @@ _public_ PAM_EXTERN int pam_sm_open_session(
|
|||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = pam_set_data(handle, "systemd.session-fd", INT_TO_PTR(session_fd+1), NULL);
|
if (session_fd >= 0) {
|
||||||
if (r != PAM_SUCCESS) {
|
r = pam_set_data(handle, "systemd.session-fd", INT_TO_PTR(session_fd+1), NULL);
|
||||||
pam_syslog(handle, LOG_ERR, "Failed to install session fd.");
|
if (r != PAM_SUCCESS) {
|
||||||
return r;
|
pam_syslog(handle, LOG_ERR, "Failed to install session fd.");
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session_fd = -1;
|
session_fd = -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user