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 <lenn...@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}