logind: when generating session ids with a counter, retry if session is already allocated

This commit is contained in:
Lennart Poettering 2011-06-24 20:46:22 +02:00
parent 1713813de3
commit 0771475394
2 changed files with 23 additions and 11 deletions

View file

@ -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);

View file

@ -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