]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pager: Fix deadlock when using built-in pager
authorFelix Riemann <felix.riemann@sma.de>
Wed, 29 May 2019 19:17:42 +0000 (21:17 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 30 May 2019 07:54:54 +0000 (09:54 +0200)
The parent is waiting for an EOF on the pipe transmitting the pager name
before starting to send data. With external pagers this happens due to
execlp() CLOEXEC'ing the pipe, so the internal pager needs to close it
manually.

src/shared/pager.c

index 2abb0f62d27da46f6df7eed3d2bdb3ca02738c86..7c20b100b46d677281c72d33082702e410941f9d 100644 (file)
@@ -194,11 +194,13 @@ int pager_open(PagerFlags flags) {
                                        "Failed to execute '%s', using next fallback pager: %m", exe);
                 }
 
-                r = loop_write(exe_name_pipe[1], "(built-in)", strlen("(built-in") + 1, false);
+                r = loop_write(exe_name_pipe[1], "(built-in)", strlen("(built-in)") + 1, false);
                 if (r < 0) {
                         log_error_errno(r, "Failed to write pager name to socket: %m");
                         _exit(EXIT_FAILURE);
                 }
+                /* Close pipe to signal the parent to start sending data */
+                safe_close_pair(exe_name_pipe);
                 pager_fallback();
                 /* not reached */
         }