45 lines
1.3 KiB
Diff
45 lines
1.3 KiB
Diff
From 3435938f43ca3737ec1d73da4d8cad756b5c9508 Mon Sep 17 00:00:00 2001
|
||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||
Date: Fri, 26 Mar 2021 16:04:43 +0000
|
||
Subject: [PATCH] daemon: chroot: Fix long-standing possible deadlock.
|
||
|
||
The child (chrooted) process wrote its answer on the pipe and then
|
||
exited. Meanwhile the parent waiting for the child to exit before
|
||
reading from the pipe. Thus if the output was larger than a Linux
|
||
pipebuffer then the whole thing would deadlock.
|
||
|
||
(cherry picked from commit 94e64b28bee3b8dc7ed354a366d6a8f7ba5f245c)
|
||
---
|
||
daemon/chroot.ml | 8 ++++----
|
||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||
|
||
diff --git a/daemon/chroot.ml b/daemon/chroot.ml
|
||
index 5e856c91f..7da8ae29e 100644
|
||
--- a/daemon/chroot.ml
|
||
+++ b/daemon/chroot.ml
|
||
@@ -62,6 +62,10 @@ let f t func arg =
|
||
(* Parent. *)
|
||
close wfd;
|
||
|
||
+ let chan = in_channel_of_descr rfd in
|
||
+ let ret = input_value chan in
|
||
+ close_in chan;
|
||
+
|
||
let _, status = waitpid [] pid in
|
||
(match status with
|
||
| WEXITED 0 -> ()
|
||
@@ -76,10 +80,6 @@ let f t func arg =
|
||
failwithf "chroot ‘%s’ stopped by signal %d" t.name i
|
||
);
|
||
|
||
- let chan = in_channel_of_descr rfd in
|
||
- let ret = input_value chan in
|
||
- close_in chan;
|
||
-
|
||
match ret with
|
||
| Either ret -> ret
|
||
| Or exn -> raise exn
|
||
--
|
||
2.31.1
|
||
|