From: Lennart Poettering Date: Thu, 16 Jun 2016 13:29:16 +0000 (+0200) Subject: systemctl: make sure we terminate the bus connection first, and then close the pager... X-Git-Tag: v231.3~91 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=08b0b97aed0c478215d563b9e29b5333e19aef45;hp=1443d4b2e7210724b40411b108b1e2d30063ca5d systemctl: make sure we terminate the bus connection first, and then close the pager (#3550) If "systemctl -H" is used, let's make sure we first terminate the bus connection, and only then close the pager. If done in this order ssh will get an EOF on stdin (as we speak D-Bus through ssh's stdin/stdout), and then terminate. This makes sure the standard error we were invoked on is released by ssh, and only that makes sure we don't deadlock on the pager which waits for all clients closing its input pipe. (Similar fixes for the various other xyzctl tools that support both pagers and -H) Fixes: #3543 --- diff --git a/src/login/loginctl.c b/src/login/loginctl.c index abc3cf38c..fd1e9b9c2 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -2037,7 +2037,7 @@ static int loginctl_main(int argc, char *argv[], sd_bus *bus) { } int main(int argc, char *argv[]) { - _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; + sd_bus *bus = NULL; int r; setlocale(LC_ALL, ""); @@ -2059,6 +2059,8 @@ int main(int argc, char *argv[]) { r = loginctl_main(argc, argv, bus); finish: + sd_bus_flush_close_unref(bus); + pager_close(); polkit_agent_close();