summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-06-24 20:46:22 +0200
committerLennart Poettering <lennart@poettering.net>2011-06-24 20:46:22 +0200
commit0771475394887e3635e67196fa6f56486fa2126c (patch)
tree4b76b1dc07f69f28fe9248a58277429f3f35ae87 /src
parent1713813de365486617ab87899f950e9b6ec928ef (diff)
logind: when generating session ids with a counter, retry if session is already allocated
Diffstat (limited to 'src')
-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