Skip to content

Commit 30a144a

Browse files
committed
fix: Prevent deadlocks due to filled pipe on stderr (#85)
1 parent 066a591 commit 30a144a

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

src/lib.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,18 @@ impl CommandExt for Command {
184184
.stderr(Stdio::piped())
185185
.spawn()?;
186186

187-
let status = process.wait()?;
188-
189-
// Read up to 256 bytes from stderr.
187+
// Consume all stderr - it's open just for a few programs which can't handle it being closed.
190188
use std::io::Read;
191189
let mut stderr = vec![0; 256];
192-
let len = process
193-
.stderr
194-
.take()
195-
.and_then(|mut err| err.read(&mut stderr).ok())
196-
.unwrap_or(0);
190+
let mut stderr_src = process.stderr.take().expect("piped stderr");
191+
192+
let len = stderr_src.read(&mut stderr).unwrap_or(0);
197193
stderr.truncate(len);
198194

195+
// consume the rest to avoid blocking
196+
std::io::copy(&mut stderr_src, &mut std::io::sink()).ok();
197+
198+
let status = process.wait()?;
199199
Ok(Output {
200200
status,
201201
stderr,

0 commit comments

Comments
 (0)