mirror of
https://github.com/systemd/systemd.git
synced 2024-10-30 14:55:37 +03:00
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
This commit is contained in:
parent
dce588ec9d
commit
cf647b69ba
@ -1987,7 +1987,7 @@ static int busctl_main(sd_bus *bus, int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
||||
sd_bus *bus = NULL;
|
||||
int r;
|
||||
|
||||
log_parse_environment();
|
||||
@ -2078,6 +2078,7 @@ int main(int argc, char *argv[]) {
|
||||
r = busctl_main(bus, argc, argv);
|
||||
|
||||
finish:
|
||||
sd_bus_flush_close_unref(bus);
|
||||
pager_close();
|
||||
|
||||
strv_free(arg_matches);
|
||||
|
@ -656,7 +656,7 @@ static int localectl_main(sd_bus *bus, int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
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, "");
|
||||
@ -676,6 +676,7 @@ int main(int argc, char*argv[]) {
|
||||
r = localectl_main(bus, argc, argv);
|
||||
|
||||
finish:
|
||||
sd_bus_flush_close_unref(bus);
|
||||
pager_close();
|
||||
|
||||
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
|
@ -1554,7 +1554,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, "");
|
||||
@ -1576,6 +1576,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();
|
||||
|
||||
|
@ -2751,7 +2751,7 @@ static int machinectl_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, "");
|
||||
@ -2773,6 +2773,7 @@ int main(int argc, char*argv[]) {
|
||||
r = machinectl_main(argc, argv, bus);
|
||||
|
||||
finish:
|
||||
sd_bus_flush_close_unref(bus);
|
||||
pager_close();
|
||||
polkit_agent_close();
|
||||
|
||||
|
@ -7938,6 +7938,8 @@ int main(int argc, char*argv[]) {
|
||||
}
|
||||
|
||||
finish:
|
||||
release_busses();
|
||||
|
||||
pager_close();
|
||||
ask_password_agent_close();
|
||||
polkit_agent_close();
|
||||
@ -7949,8 +7951,6 @@ finish:
|
||||
strv_free(arg_wall);
|
||||
free(arg_root);
|
||||
|
||||
release_busses();
|
||||
|
||||
/* Note that we return r here, not EXIT_SUCCESS, so that we can implement the LSB-like return codes */
|
||||
return r < 0 ? EXIT_FAILURE : r;
|
||||
}
|
||||
|
@ -480,7 +480,7 @@ static int timedatectl_main(sd_bus *bus, int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
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, "");
|
||||
@ -500,6 +500,7 @@ int main(int argc, char *argv[]) {
|
||||
r = timedatectl_main(bus, argc, argv);
|
||||
|
||||
finish:
|
||||
sd_bus_flush_close_unref(bus);
|
||||
pager_close();
|
||||
|
||||
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
|
Loading…
Reference in New Issue
Block a user