From 30cf79c423650f3d01a570dc56baf25b5a1c5285 Mon Sep 17 00:00:00 2001 From: Alice Ryhl Date: Sun, 12 Dec 2021 11:10:56 +0100 Subject: [PATCH 1/2] process: drop pipe after child exits in `wait_with_output` --- tokio/src/process/mod.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tokio/src/process/mod.rs b/tokio/src/process/mod.rs index 8a0d9db25fd..e559ca4a934 100644 --- a/tokio/src/process/mod.rs +++ b/tokio/src/process/mod.rs @@ -1130,19 +1130,25 @@ impl Child { pub async fn wait_with_output(mut self) -> io::Result { use crate::future::try_join3; - async fn read_to_end(io: Option) -> io::Result> { + async fn read_to_end(io: &mut Option) -> io::Result> { let mut vec = Vec::new(); - if let Some(mut io) = io { - crate::io::util::read_to_end(&mut io, &mut vec).await?; + if let Some(io) = io.as_mut() { + crate::io::util::read_to_end(io, &mut vec).await?; } Ok(vec) } - let stdout_fut = read_to_end(self.stdout.take()); - let stderr_fut = read_to_end(self.stderr.take()); + let mut stdout_pipe = self.stdout.take(); + let mut stderr_pipe = self.stderr.take(); + + let stdout_fut = read_to_end(&mut stdout_pipe); + let stderr_fut = read_to_end(&mut stderr_pipe); let (status, stdout, stderr) = try_join3(self.wait(), stdout_fut, stderr_fut).await?; + drop(stdout_pipe); + drop(stderr_pipe); + Ok(Output { status, stdout, From 686c6461f0484fadd1f21bf85491dab4db500017 Mon Sep 17 00:00:00 2001 From: Alice Ryhl Date: Mon, 10 Jan 2022 11:21:32 +0100 Subject: [PATCH 2/2] Update tokio/src/process/mod.rs --- tokio/src/process/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tokio/src/process/mod.rs b/tokio/src/process/mod.rs index e559ca4a934..67d43b4d80e 100644 --- a/tokio/src/process/mod.rs +++ b/tokio/src/process/mod.rs @@ -1146,6 +1146,7 @@ impl Child { let (status, stdout, stderr) = try_join3(self.wait(), stdout_fut, stderr_fut).await?; + // Drop happens after `try_join` due to drop(stdout_pipe); drop(stderr_pipe);