diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/main.rs | 1 | ||||
-rw-r--r-- | cli/tests/node_compat/config.jsonc | 2 | ||||
-rw-r--r-- | cli/tests/node_compat/test/parallel/test-tty-stdin-end.js | 14 | ||||
-rw-r--r-- | cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js | 74 | ||||
-rw-r--r-- | cli/util/unix.rs | 24 |
5 files changed, 115 insertions, 0 deletions
diff --git a/cli/main.rs b/cli/main.rs index 0817c0984..dbd3b470b 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -272,6 +272,7 @@ pub(crate) fn unstable_warn_cb(feature: &str) { pub fn main() { setup_panic_hook(); + util::unix::prepare_stdio(); util::unix::raise_fd_limit(); util::windows::ensure_stdio_open(); #[cfg(windows)] diff --git a/cli/tests/node_compat/config.jsonc b/cli/tests/node_compat/config.jsonc index 8a31f4dc2..93a51b671 100644 --- a/cli/tests/node_compat/config.jsonc +++ b/cli/tests/node_compat/config.jsonc @@ -88,6 +88,7 @@ "test-querystring.js", "test-readline-interface.js", "test-stdin-from-file-spawn.js", + "test-ttywrap-invalid-fd.js", "test-url-urltooptions.js", "test-util-format.js", "test-util-inspect-namespace.js", @@ -625,6 +626,7 @@ "test-timers-unref-throw-then-ref.js", "test-timers-user-call.js", "test-timers-zero-timeout.js", + "test-tty-stdin-end.js", "test-url-domain-ascii-unicode.js", "test-url-fileurltopath.js", "test-url-format-invalid-input.js", diff --git a/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js b/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js new file mode 100644 index 000000000..ee38cbd2c --- /dev/null +++ b/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js @@ -0,0 +1,14 @@ +// deno-fmt-ignore-file +// deno-lint-ignore-file + +// Copyright Joyent and Node contributors. All rights reserved. MIT license. +// Taken from Node 18.12.1 +// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. + +'use strict'; +require('../common'); + +// This test ensures that Node.js doesn't crash on `process.stdin.emit("end")`. +// https://github.com/nodejs/node/issues/1068 + +process.stdin.emit('end'); diff --git a/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js b/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js new file mode 100644 index 000000000..95b9bffe6 --- /dev/null +++ b/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js @@ -0,0 +1,74 @@ +// deno-fmt-ignore-file +// deno-lint-ignore-file + +// Copyright Joyent and Node contributors. All rights reserved. MIT license. +// Taken from Node 18.12.1 +// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. + +// Flags: --expose-internals +'use strict'; + +// const common = require('../common'); +const tty = require('tty'); +// const { internalBinding } = require('internal/test/binding'); +// const { +// UV_EBADF, +// UV_EINVAL +// } = internalBinding('uv'); +const assert = require('assert'); + +assert.throws( + () => new tty.WriteStream(-1), + { + code: 'ERR_INVALID_FD', + name: 'RangeError', + message: '"fd" must be a positive integer: -1' + } +); + +// { +// const info = { +// code: common.isWindows ? 'EBADF' : 'EINVAL', +// message: common.isWindows ? 'bad file descriptor' : 'invalid argument', +// errno: common.isWindows ? UV_EBADF : UV_EINVAL, +// syscall: 'uv_tty_init' +// }; + +// const suffix = common.isWindows ? +// 'EBADF (bad file descriptor)' : 'EINVAL (invalid argument)'; +// const message = `TTY initialization failed: uv_tty_init returned ${suffix}`; + +// assert.throws( +// () => { +// common.runWithInvalidFD((fd) => { +// new tty.WriteStream(fd); +// }); +// }, { +// code: 'ERR_TTY_INIT_FAILED', +// name: 'SystemError', +// message, +// info +// } +// ); + +// assert.throws( +// () => { +// common.runWithInvalidFD((fd) => { +// new tty.ReadStream(fd); +// }); +// }, { +// code: 'ERR_TTY_INIT_FAILED', +// name: 'SystemError', +// message, +// info +// }); +// } + +assert.throws( + () => new tty.ReadStream(-1), + { + code: 'ERR_INVALID_FD', + name: 'RangeError', + message: '"fd" must be a positive integer: -1' + } +); diff --git a/cli/util/unix.rs b/cli/util/unix.rs index fd0c94ea6..2fa3c2063 100644 --- a/cli/util/unix.rs +++ b/cli/util/unix.rs @@ -43,3 +43,27 @@ pub fn raise_fd_limit() { } } } + +pub fn prepare_stdio() { + #[cfg(unix)] + // SAFETY: Save current state of stdio and restore it when we exit. + unsafe { + use libc::atexit; + use libc::tcgetattr; + use libc::tcsetattr; + use libc::termios; + + let mut termios = std::mem::zeroed::<termios>(); + if tcgetattr(libc::STDIN_FILENO, &mut termios) == 0 { + static mut ORIG_TERMIOS: Option<termios> = None; + ORIG_TERMIOS = Some(termios); + + extern "C" fn reset_stdio() { + // SAFETY: Reset the stdio state. + unsafe { tcsetattr(libc::STDIN_FILENO, 0, &ORIG_TERMIOS.unwrap()) }; + } + + atexit(reset_stdio); + } + } +} |