1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
From d982f0decd1215d6fbd60c0e9ce6c0ffb8a0188c Mon Sep 17 00:00:00 2001
From: Felix Riemann <felix.riemann@sma.de>
Date: Wed, 29 May 2019 21:17:42 +0200
Subject: 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.
---
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 7a56271760..6f1d57a096 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
|