[arch-commits] Commit in systemd/trunk (2 files)

Dave Reisner dreisner at archlinux.org
Sun Apr 1 19:16:48 EDT 2012


    Date: Sunday, April 1, 2012 @ 19:16:47
  Author: dreisner
Revision: 155343

upgpkg: systemd 44-4

- backport patch to fix FS#28386
- move bash-completion to /usr/share/bash-completion

Added:
  systemd/trunk/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch
Modified:
  systemd/trunk/PKGBUILD

-------------------------------------------------------------+
 0001-logind-close-FIFO-before-ending-sessions-cleanly.patch |  156 ++++++++++
 PKGBUILD                                                    |   20 -
 2 files changed, 171 insertions(+), 5 deletions(-)

Added: 0001-logind-close-FIFO-before-ending-sessions-cleanly.patch
===================================================================
--- 0001-logind-close-FIFO-before-ending-sessions-cleanly.patch	                        (rev 0)
+++ 0001-logind-close-FIFO-before-ending-sessions-cleanly.patch	2012-04-01 23:16:47 UTC (rev 155343)
@@ -0,0 +1,156 @@
+From 75c8e3cffd7da8eede614cf61384957af2c82a29 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Thu, 22 Mar 2012 02:06:40 +0100
+Subject: [PATCH] logind: close FIFO before ending sessions cleanly
+
+For clean session endings ask logind explicitly to get rid of the FIFO
+before closing it so that the FIFO logic doesn't result in su/sudo to be
+terminated immediately.
+---
+ src/login/logind-dbus.c |   30 ++++++++++++++++++++
+ src/login/pam-module.c  |   71 +++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 98 insertions(+), 3 deletions(-)
+
+diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
+index d8f4d89..ea6b89f 100644
+--- a/src/login/logind-dbus.c
++++ b/src/login/logind-dbus.c
+@@ -80,6 +80,9 @@
+         "   <arg name=\"seat\" type=\"s\" direction=\"out\"/>\n"        \
+         "   <arg name=\"vtnr\" type=\"u\" direction=\"out\"/>\n"        \
+         "  </method>\n"                                                 \
++        "  <method name=\"ReleaseSession\">\n"                          \
++        "   <arg name=\"id\" type=\"s\" direction=\"in\"/>\n"           \
++        "  </method>\n"                                                 \
+         "  <method name=\"ActivateSession\">\n"                         \
+         "   <arg name=\"id\" type=\"s\" direction=\"in\"/>\n"           \
+         "  </method>\n"                                                 \
+@@ -1075,6 +1078,33 @@ static DBusHandlerResult manager_message_handler(
+                 if (r < 0)
+                         return bus_send_error_reply(connection, message, &error, r);
+ 
++        } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ReleaseSession")) {
++                const char *name;
++                Session *session;
++
++                if (!dbus_message_get_args(
++                                    message,
++                                    &error,
++                                    DBUS_TYPE_STRING, &name,
++                                    DBUS_TYPE_INVALID))
++                        return bus_send_error_reply(connection, message, &error, -EINVAL);
++
++                session = hashmap_get(m->sessions, name);
++                if (!session)
++                        return bus_send_error_reply(connection, message, &error, -ENOENT);
++
++                /* We use the FIFO to detect stray sessions where the
++                process invoking PAM dies abnormally. We need to make
++                sure that that process is not killed if at the clean
++                end of the session it closes the FIFO. Hence, with
++                this call explicitly turn off the FIFO logic, so that
++                the PAM code can finish clean up on its own */
++                session_remove_fifo(session);
++
++                reply = dbus_message_new_method_return(message);
++                if (!reply)
++                        goto oom;
++
+         } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ActivateSession")) {
+                 const char *name;
+                 Session *session;
+diff --git a/src/login/pam-module.c b/src/login/pam-module.c
+index 8544413..4106d2b 100644
+--- a/src/login/pam-module.c
++++ b/src/login/pam-module.c
+@@ -414,7 +414,6 @@ _public_ PAM_EXTERN int pam_sm_open_session(
+                         "/org/freedesktop/login1",
+                         "org.freedesktop.login1.Manager",
+                         "CreateSession");
+-
+         if (!m) {
+                 pam_syslog(handle, LOG_ERR, "Could not allocate create session message.");
+                 r = PAM_BUF_ERR;
+@@ -620,11 +619,77 @@ _public_ PAM_EXTERN int pam_sm_close_session(
+                 int argc, const char **argv) {
+ 
+         const void *p = NULL;
++        const char *id;
++        DBusConnection *bus = NULL;
++        DBusMessage *m = NULL, *reply = NULL;
++        DBusError error;
++        int r;
+ 
+-        pam_get_data(handle, "systemd.session-fd", &p);
++        assert(handle);
++
++        dbus_error_init(&error);
++
++        id = pam_getenv(handle, "XDG_SESSION_ID");
++        if (id) {
++
++                /* Before we go and close the FIFO we need to tell
++                 * logind that this is a clean session shutdown, so
++                 * that it doesn't just go and slaughter us
++                 * immediately after closing the fd */
++
++                bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
++                if (!bus) {
++                        pam_syslog(handle, LOG_ERR, "Failed to connect to system bus: %s", bus_error_message(&error));
++                        r = PAM_SESSION_ERR;
++                        goto finish;
++                }
++
++                m = dbus_message_new_method_call(
++                                "org.freedesktop.login1",
++                                "/org/freedesktop/login1",
++                                "org.freedesktop.login1.Manager",
++                                "ReleaseSession");
++                if (!m) {
++                        pam_syslog(handle, LOG_ERR, "Could not allocate release session message.");
++                        r = PAM_BUF_ERR;
++                        goto finish;
++                }
++
++                if (!dbus_message_append_args(m,
++                                              DBUS_TYPE_STRING, &id,
++                                              DBUS_TYPE_INVALID)) {
++                        pam_syslog(handle, LOG_ERR, "Could not attach parameters to message.");
++                        r = PAM_BUF_ERR;
++                        goto finish;
++                }
+ 
++                reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
++                if (!reply) {
++                        pam_syslog(handle, LOG_ERR, "Failed to release session: %s", bus_error_message(&error));
++                        r = PAM_SESSION_ERR;
++                        goto finish;
++                }
++        }
++
++        r = PAM_SUCCESS;
++
++finish:
++        pam_get_data(handle, "systemd.session-fd", &p);
+         if (p)
+                 close_nointr(PTR_TO_INT(p) - 1);
+ 
+-        return PAM_SUCCESS;
++        dbus_error_free(&error);
++
++        if (bus) {
++                dbus_connection_close(bus);
++                dbus_connection_unref(bus);
++        }
++
++        if (m)
++                dbus_message_unref(m);
++
++        if (reply)
++                dbus_message_unref(reply);
++
++        return r;
+ }
+-- 
+1.7.9.5
+

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-04-01 22:24:23 UTC (rev 155342)
+++ PKGBUILD	2012-04-01 23:16:47 UTC (rev 155343)
@@ -4,7 +4,7 @@
 pkgbase=systemd
 pkgname=('systemd' 'libsystemd')
 pkgver=44
-pkgrel=3
+pkgrel=4
 arch=('i686' 'x86_64')
 url="http://www.freedesktop.org/wiki/Software/systemd"
 license=('GPL2')
@@ -13,10 +13,12 @@
 options=('!libtool')
 source=("http://www.freedesktop.org/software/$pkgname/$pkgname-$pkgver.tar.xz"
         "os-release"
-        0001-util-never-follow-symlinks-in-rm_rf_children.patch)
+        0001-util-never-follow-symlinks-in-rm_rf_children.patch
+        0001-logind-close-FIFO-before-ending-sessions-cleanly.patch)
 md5sums=('11f44ff74c87850064e4351518bcff17'
          '752636def0db3c03f121f8b4f44a63cd'
-         'b5863d6d4b47e2b5bda8eb57bde0d327')
+         'b5863d6d4b47e2b5bda8eb57bde0d327'
+         'd37833358ef6c23fad622ea4a0941d1f')
 
 build() {
   cd "$pkgname-$pkgver"
@@ -24,6 +26,9 @@
   # https://bugzilla.redhat.com/show_bug.cgi?id=803358
   patch -Np1 <"$srcdir/0001-util-never-follow-symlinks-in-rm_rf_children.patch"
 
+  # https://bugs.archlinux.org/task/28386
+  patch -Np1 <"$srcdir/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch"
+
   ./configure --sysconfdir=/etc \
               --libexecdir=/usr/lib \
               --with-pamlibdir=/lib/security \
@@ -65,9 +70,8 @@
   chmod 644 "$pkgdir/usr/lib/tmpfiles.d/console.conf"
 
   # symlink to /bin/systemd for compat and sanity
-  mkdir -p "$pkgdir/bin"
+  install -dm755 "$pkgdir/bin" "$pkgdir/lib/systemd"
   ln -s ../usr/lib/systemd/systemd "$pkgdir/bin/systemd"
-  mkdir -p "$pkgdir/lib/systemd"
   ln -s ../../usr/lib/systemd/systemd "$pkgdir/lib/systemd/systemd"
 
   # use python2 for systemd-analyze
@@ -89,6 +93,12 @@
     mv "$manpage" "$section/systemd.$page"
   done
 
+  # move bash-completion and symlink for loginctl
+  install -Dm644 "$pkgdir/etc/bash_completion.d/systemd-bash-completion.sh" \
+    "$pkgdir/usr/share/bash-completion/completions/systemctl"
+  ln -s systemctl "$pkgdir/usr/share/bash-completion/completions/loginctl"
+  rm -rf "$pkgdir/etc/bash_completion.d"
+
   ### split off libsystemd (libs, includes, pkgconfig, man3)
   install -dm755 "$srcdir"/libsystemd/usr/{include,lib/pkgconfig}
 



More information about the arch-commits mailing list