[systemd-commits] 2 commits - TODO src/login

Lennart Poettering lennart at kemper.freedesktop.org
Mon Mar 4 19:10:30 PST 2013


 TODO                    |    2 
 src/login/logind-dbus.c |  173 +++++++++++++++++++++++-------------------------
 2 files changed, 88 insertions(+), 87 deletions(-)

New commits:
commit 6bc80e94b66e6b008cdc21101fc7409ebcb279db
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Mar 5 04:10:19 2013 +0100

    update TODO

diff --git a/TODO b/TODO
index 4ea0471..cef02e6 100644
--- a/TODO
+++ b/TODO
@@ -49,6 +49,8 @@ Fedora 19:
 
 Features:
 
+* neither pkexec nor sudo initialize environ[] from the PAM environment?
+
 * rework specifier logic so that we can distuingish OOM errors from other errors
 
 * systemd-inhibit: refuse taking delay locks

commit 954449b82df7fc2d37a8d854977a1a73a65edfbd
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Mar 5 03:29:54 2013 +0100

    logind: when registering a new session always use previous session info from cgroup path rather than audit
    
    Previously for cases like "su" or "sudo" where a session is attempted to
    be created from within an existing one we used the audit session ID to
    detect this and in such a case we simple returned the session data of
    the original session a second time.
    
    With this change we will now use the cgroup path of the calling path to
    determine the old session, i.e. we only rely on our own session
    identification scheme, instead of audits.
    
    We will continue to keep the audit session ID and ours in sync however,
    to avoid unnecessary confusion.

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 818f2fa..1dcdf04 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -308,21 +308,21 @@ static int bus_manager_append_preparing(DBusMessageIter *i, const char *property
 }
 
 static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMessage **_reply) {
-        Session *session = NULL;
-        User *user = NULL;
-        const char *type, *class, *seat, *tty, *display, *remote_user, *remote_host, *service;
+        const char *type, *class, *cseat, *tty, *display, *remote_user, *remote_host, *service;
         uint32_t uid, leader, audit_id = 0;
         dbus_bool_t remote, kill_processes, exists;
-        char **controllers = NULL, **reset_controllers = NULL;
+        _cleanup_strv_free_ char **controllers = NULL, **reset_controllers = NULL;
+        _cleanup_free_ char *cgroup = NULL, *id = NULL, *p = NULL;
         SessionType t;
         SessionClass c;
-        Seat *s;
         DBusMessageIter iter;
         int r;
-        char *id = NULL, *p;
         uint32_t vtnr = 0;
-        int fifo_fd = -1;
+        _cleanup_close_ int fifo_fd = -1;
         DBusMessage *reply = NULL;
+        Session *session = NULL;
+        User *user = NULL;
+        Seat *seat = NULL;
         bool b;
 
         assert(m);
@@ -371,13 +371,13 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
             dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
                 return -EINVAL;
 
-        dbus_message_iter_get_basic(&iter, &seat);
+        dbus_message_iter_get_basic(&iter, &cseat);
 
-        if (isempty(seat))
-                s = NULL;
+        if (isempty(cseat))
+                seat = NULL;
         else {
-                s = hashmap_get(m->seats, seat);
-                if (!s)
+                seat = hashmap_get(m->seats, cseat);
+                if (!seat)
                         return -ENOENT;
         }
 
@@ -396,9 +396,9 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
         if (tty_is_vc(tty)) {
                 int v;
 
-                if (!s)
-                        s = m->vtconsole;
-                else if (s != m->vtconsole)
+                if (!seat)
+                        seat = m->vtconsole;
+                else if (seat != m->vtconsole)
                         return -EINVAL;
 
                 v = vtnr_from_tty(tty);
@@ -412,18 +412,17 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                         return -EINVAL;
         } else if (tty_is_console(tty)) {
 
-                if (!s)
-                        s = m->vtconsole;
-                else if (s != m->vtconsole)
+                if (!seat)
+                        seat = m->vtconsole;
+                else if (seat != m->vtconsole)
                         return -EINVAL;
 
                 if (vtnr != 0)
                         return -EINVAL;
-
         }
 
-        if (s) {
-                if (seat_can_multi_session(s)) {
+        if (seat) {
+                if (seat_can_multi_session(seat)) {
                         if (vtnr > 63)
                                 return -EINVAL;
                 } else {
@@ -486,78 +485,83 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
 
         dbus_message_iter_get_basic(&iter, &kill_processes);
 
-        r = manager_add_user_by_uid(m, uid, &user);
+        r = cg_pid_get_cgroup(leader, NULL, &cgroup);
         if (r < 0)
                 goto fail;
 
-        audit_session_from_pid(leader, &audit_id);
-
-        if (audit_id > 0) {
-                asprintf(&id, "%lu", (unsigned long) audit_id);
+        r = manager_get_session_by_cgroup(m, cgroup, &session);
+        if (r < 0)
+                goto fail;
 
-                if (!id) {
-                        r = -ENOMEM;
+        if (session) {
+                fifo_fd = session_create_fifo(session);
+                if (fifo_fd < 0) {
+                        r = fifo_fd;
                         goto fail;
                 }
 
-                session = hashmap_get(m->sessions, id);
+                /* Session already exists, client is probably
+                 * something like "su" which changes uid but
+                 * is still the same audit session */
 
-                if (session) {
-                        free(id);
+                reply = dbus_message_new_method_return(message);
+                if (!reply) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
 
-                        fifo_fd = session_create_fifo(session);
-                        if (fifo_fd < 0) {
-                                r = fifo_fd;
-                                goto fail;
-                        }
+                p = session_bus_path(session);
+                if (!p) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
 
-                        /* Session already exists, client is probably
-                         * something like "su" which changes uid but
-                         * is still the same audit session */
+                cseat = session->seat ? session->seat->id : "";
+                vtnr = session->vtnr;
+                exists = true;
 
-                        reply = dbus_message_new_method_return(message);
-                        if (!reply) {
-                                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, &fifo_fd,
+                                DBUS_TYPE_STRING, &cseat,
+                                DBUS_TYPE_UINT32, &vtnr,
+                                DBUS_TYPE_BOOLEAN, &exists,
+                                DBUS_TYPE_INVALID);
+                if (!b) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
 
-                        p = session_bus_path(session);
-                        if (!p) {
-                                r = -ENOMEM;
-                                goto fail;
-                        }
+                *_reply = reply;
 
-                        seat = session->seat ? session->seat->id : "";
-                        vtnr = session->vtnr;
-                        exists = true;
-
-                        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, &fifo_fd,
-                                        DBUS_TYPE_STRING, &seat,
-                                        DBUS_TYPE_UINT32, &vtnr,
-                                        DBUS_TYPE_BOOLEAN, &exists,
-                                        DBUS_TYPE_INVALID);
-                        free(p);
+                return 0;
+        }
 
-                        if (!b) {
-                                r = -ENOMEM;
-                                goto fail;
-                        }
+        audit_session_from_pid(leader, &audit_id);
+        if (audit_id > 0) {
+                /* Keep our session IDs and the audit session IDs in sync */
 
-                        close_nointr_nofail(fifo_fd);
-                        *_reply = reply;
+                if (asprintf(&id, "%lu", (unsigned long) audit_id) < 0) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
 
-                        strv_free(controllers);
-                        strv_free(reset_controllers);
+                /* Wut? There's already a session by this name and we
+                 * didn't find it above? Weird, then let's not trust
+                 * the audit data and let's better register a new
+                 * ID */
+                if (hashmap_get(m->sessions, id)) {
+                        audit_id = 0;
 
-                        return 0;
+                        free(id);
+                        id = NULL;
                 }
+        }
 
-        } else {
+        if (!id) {
                 do {
                         free(id);
                         id = NULL;
@@ -570,8 +574,11 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                 } while (hashmap_get(m->sessions, id));
         }
 
+        r = manager_add_user_by_uid(m, uid, &user);
+        if (r < 0)
+                goto fail;
+
         r = manager_add_session(m, user, id, &session);
-        free(id);
         if (r < 0)
                 goto fail;
 
@@ -633,8 +640,8 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                 goto fail;
         }
 
-        if (s) {
-                r = seat_attach_session(s, session);
+        if (seat) {
+                r = seat_attach_session(seat, session);
                 if (r < 0)
                         goto fail;
         }
@@ -655,7 +662,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                 goto fail;
         }
 
-        seat = s ? s->id : "";
+        cseat = seat ? seat->id : "";
         exists = false;
         b = dbus_message_append_args(
                         reply,
@@ -663,35 +670,27 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                         DBUS_TYPE_OBJECT_PATH, &p,
                         DBUS_TYPE_STRING, &session->user->runtime_path,
                         DBUS_TYPE_UNIX_FD, &fifo_fd,
-                        DBUS_TYPE_STRING, &seat,
+                        DBUS_TYPE_STRING, &cseat,
                         DBUS_TYPE_UINT32, &vtnr,
                         DBUS_TYPE_BOOLEAN, &exists,
                         DBUS_TYPE_INVALID);
-        free(p);
 
         if (!b) {
                 r = -ENOMEM;
                 goto fail;
         }
 
-        close_nointr_nofail(fifo_fd);
         *_reply = reply;
 
         return 0;
 
 fail:
-        strv_free(controllers);
-        strv_free(reset_controllers);
-
         if (session)
                 session_add_to_gc_queue(session);
 
         if (user)
                 user_add_to_gc_queue(user);
 
-        if (fifo_fd >= 0)
-                close_nointr_nofail(fifo_fd);
-
         if (reply)
                 dbus_message_unref(reply);
 



More information about the systemd-commits mailing list