From 646dad6ecd27866f27c04edfa2ece578b7a00119 Mon Sep 17 00:00:00 2001 From: Felix Riemann Date: Wed, 29 May 2019 21:17:42 +0200 Subject: [PATCH] pager: Fix deadlock when using built-in pager 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/shared/pager.c b/src/shared/pager.c index 7a562717..6f1d57a0 100644 --- a/src/shared/pager.c +++ b/src/shared/pager.c @@ -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 */ } -- 2.30.2