diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-06-24 20:46:22 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-06-24 20:46:22 +0200 |
commit | 0771475394887e3635e67196fa6f56486fa2126c (patch) | |
tree | 4b76b1dc07f69f28fe9248a58277429f3f35ae87 | |
parent | 1713813de365486617ab87899f950e9b6ec928ef (diff) |
logind: when generating session ids with a counter, retry if session is already allocated
-rw-r--r-- | src/logind-dbus.c | 33 | ||||
-rw-r--r-- | src/logind.h | 1 |
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 |