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)
committerAdrian Bunk <bunk@debian.org>
Thu, 29 Jun 2023 13:57:02 +0000 (14:57 +0100)
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.

Gbp-Pq: Name 0003-pager-Fix-deadlock-when-using-built-in-pager.patch

src/shared/pager.c

index 7a56271760ad916a27bdbb03c9489aaa1d38a397..6f1d57a096985fc72dd3f9702821851520024474 100644 (file)
@@ -212,11 +212,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 */
         }