Skip to content

Don't dup the stdio file descriptors. #10804

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 5, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/librustuv/tty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ impl TtyWatcher {
return Err(UvError(uvll::EBADF));
}

// libuv was recently changed to not close the stdio file descriptors,
// but it did not change the behavior for windows. Until this issue is
// fixed, we need to dup the stdio file descriptors because otherwise
// uv_close will close them
let fd = if cfg!(windows) && fd <= libc::STDERR_FILENO {
unsafe { libc::dup(fd) }
} else { fd };

// If this file descriptor is indeed guessed to be a tty, then go ahead
// with attempting to open it as a tty.
let handle = UvHandle::alloc(None::<TtyWatcher>, uvll::UV_TTY);
Expand Down
4 changes: 3 additions & 1 deletion src/libstd/io/native/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,9 @@ impl rtio::IoFactory for IoFactory {
}
fn tty_open(&mut self, fd: c_int, _readable: bool) -> IoResult<~RtioTTY> {
if unsafe { libc::isatty(fd) } != 0 {
Ok(~file::FileDesc::new(fd, true) as ~RtioTTY)
// Don't ever close the stdio file descriptors, nothing good really
// comes of that.
Ok(~file::FileDesc::new(fd, fd > libc::STDERR_FILENO) as ~RtioTTY)
} else {
Err(IoError {
kind: io::MismatchedFileTypeForOperation,
Expand Down
14 changes: 2 additions & 12 deletions src/libstd/io/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ use libc;
use option::{Option, Some, None};
use result::{Ok, Err};
use io::buffered::LineBufferedWriter;
use rt::rtio::{IoFactory, RtioTTY, RtioFileStream, with_local_io,
CloseAsynchronously};
use rt::rtio::{IoFactory, RtioTTY, RtioFileStream, with_local_io, DontClose};
use super::{Reader, Writer, io_error, IoError, OtherIoError,
standard_error, EndOfFile};

Expand Down Expand Up @@ -71,18 +70,9 @@ enum StdSource {

fn src<T>(fd: libc::c_int, readable: bool, f: |StdSource| -> T) -> T {
with_local_io(|io| {
let fd = unsafe { libc::dup(fd) };
match io.tty_open(fd, readable) {
Ok(tty) => Some(f(TTY(tty))),
Err(_) => {
// It's not really that desirable if these handles are closed
// synchronously, and because they're squirreled away in a task
// structure the destructors will be run when the task is
// attempted to get destroyed. This means that if we run a
// synchronous destructor we'll attempt to do some scheduling
// operations which will just result in sadness.
Some(f(File(io.fs_from_raw_fd(fd, CloseAsynchronously))))
}
Err(_) => Some(f(File(io.fs_from_raw_fd(fd, DontClose)))),
}
}).unwrap()
}
Expand Down