Skip to content
Open
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
13 changes: 12 additions & 1 deletion executor/src/host/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,18 @@ impl Host {
let fd: i32 = fd_str
.parse()
.with_context(|| format!("parsing fd number from '{fd_str}'"))?;
let stream = unsafe { std::os::unix::net::UnixStream::from_raw_fd(fd) };
// SAFETY: The caller owns `fd` and expects us to use it, not
// consume it. `from_raw_fd` takes ownership and would close the
// original fd on drop, so we must dup() first to get an
// independent copy that this Host can safely own and close.
let duped = unsafe { libc::dup(fd) };
if duped < 0 {
anyhow::bail!(
"failed to dup fd {fd}: {}",
std::io::Error::last_os_error()
);
}
let stream = unsafe { std::os::unix::net::UnixStream::from_raw_fd(duped) };
Box::new(bufreaderwriter::seq::BufReaderWriterSeq::new_writer(stream))
} else {
Box::new(bufreaderwriter::seq::BufReaderWriterSeq::new_writer(
Expand Down