summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/logind-dbus.c33
-rw-r--r--src/logind.h1
2 files changed, 23 insertions, 11 deletions
diff --git a/src/logind-dbus.c b/src/logind-dbus.c
index 0f3de41fff..2bad549fc5 100644
--- a/src/logind-dbus.c
+++ b/src/logind-dbus.c
@@ -176,7 +176,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
Seat *s;
DBusMessageIter iter;
int r;
- char *id, *p;
+ char *id = NULL, *p;
int vtnr = -1;
int pipe_fds[2] = { -1, -1 };
DBusMessage *reply = NULL;
@@ -306,19 +306,30 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
audit_session_from_pid(leader, &audit_id);
- if (audit_id > 0)
+ if (audit_id > 0) {
asprintf(&id, "%lu", (unsigned long) audit_id);
- else
- asprintf(&id, "c%lu", ++m->session_counter);
- if (!id) {
- r = -ENOMEM;
- goto fail;
- }
+ if (!id) {
+ r = -ENOMEM;
+ goto fail;
+ }
- if (hashmap_get(m->sessions, id)) {
- r = -EEXIST;
- goto fail;
+ if (hashmap_get(m->sessions, id)) {
+ r = -EEXIST;
+ goto fail;
+ }
+
+ } else {
+ do {
+ free(id);
+ asprintf(&id, "c%lu", ++m->session_counter);
+
+ if (!id) {
+ r = -ENOMEM;
+ goto fail;
+ }
+
+ } while (hashmap_get(m->sessions, id));
}
r = manager_add_session(m, user, id, &session);
diff --git a/src/logind.h b/src/logind.h
index d8674e7511..2b9b702f3d 100644
--- a/src/logind.h
+++ b/src/logind.h
@@ -40,6 +40,7 @@
* 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