From 580c9f9ef02f8e8226437137867d3edeb9241b5e Mon Sep 17 00:00:00 2001 From: Charlie Moog Date: Mon, 21 Jun 2021 21:39:59 -0500 Subject: [PATCH] fix(core): don't panic on stdout/stderr write failures in Deno.core.print (#11039) --- cli/tests/integration_tests.rs | 23 +++++++++++++++++++++++ core/ops_builtin.rs | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index ce4c8d7d85..da436b5bd6 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -3230,6 +3230,29 @@ console.log("finish"); util::test_pty(args, output, input); } + #[test] + fn broken_stdout() { + let (reader, writer) = os_pipe::pipe().unwrap(); + // drop the reader to create a broken pipe + drop(reader); + + let output = util::deno_cmd() + .current_dir(util::root_path()) + .arg("eval") + .arg("console.log(3.14)") + .stdout(writer) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap() + .wait_with_output() + .unwrap(); + + assert!(!output.status.success()); + let stderr = std::str::from_utf8(output.stderr.as_ref()).unwrap().trim(); + assert!(stderr.contains("Uncaught BrokenPipe")); + assert!(!stderr.contains("panic")); + } + itest!(_091_use_define_for_class_fields { args: "run 091_use_define_for_class_fields.ts", output: "091_use_define_for_class_fields.ts.out", diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs index ea539bc0a7..96ee4ff5ef 100644 --- a/core/ops_builtin.rs +++ b/core/ops_builtin.rs @@ -61,10 +61,10 @@ pub fn op_print( is_err: bool, ) -> Result<(), AnyError> { if is_err { - eprint!("{}", msg); + stderr().write_all(msg.as_bytes())?; stderr().flush().unwrap(); } else { - print!("{}", msg); + stdout().write_all(msg.as_bytes())?; stdout().flush().unwrap(); } Ok(())