Fix stdio descriptors in exec by removing cloexec if present. Use dup2 instead of dup
This commit is contained in:
parent
28a7429977
commit
1bc9e5da23
@ -270,19 +270,22 @@ impl Command {
|
||||
}
|
||||
|
||||
if let Some(fd) = stdio.stderr.fd() {
|
||||
let _ = syscall::close(2);
|
||||
t!(cvt(syscall::dup(fd, &[])));
|
||||
let _ = syscall::close(fd);
|
||||
t!(cvt(syscall::dup2(fd, 2, &[])));
|
||||
let mut flags = t!(cvt(syscall::fcntl(2, syscall::F_GETFL, 0)));
|
||||
flags &= ! syscall::O_CLOEXEC;
|
||||
t!(cvt(syscall::fcntl(2, syscall::F_SETFL, flags)));
|
||||
}
|
||||
if let Some(fd) = stdio.stdout.fd() {
|
||||
let _ = syscall::close(1);
|
||||
t!(cvt(syscall::dup(fd, &[])));
|
||||
let _ = syscall::close(fd);
|
||||
t!(cvt(syscall::dup2(fd, 1, &[])));
|
||||
let mut flags = t!(cvt(syscall::fcntl(1, syscall::F_GETFL, 0)));
|
||||
flags &= ! syscall::O_CLOEXEC;
|
||||
t!(cvt(syscall::fcntl(1, syscall::F_SETFL, flags)));
|
||||
}
|
||||
if let Some(fd) = stdio.stdin.fd() {
|
||||
let _ = syscall::close(0);
|
||||
t!(cvt(syscall::dup(fd, &[])));
|
||||
let _ = syscall::close(fd);
|
||||
t!(cvt(syscall::dup2(fd, 0, &[])));
|
||||
let mut flags = t!(cvt(syscall::fcntl(0, syscall::F_GETFL, 0)));
|
||||
flags &= ! syscall::O_CLOEXEC;
|
||||
t!(cvt(syscall::fcntl(0, syscall::F_SETFL, flags)));
|
||||
}
|
||||
|
||||
if let Some(g) = self.gid {
|
||||
|
@ -71,6 +71,11 @@ pub fn dup(fd: usize, buf: &[u8]) -> Result<usize> {
|
||||
unsafe { syscall3(SYS_DUP, fd, buf.as_ptr() as usize, buf.len()) }
|
||||
}
|
||||
|
||||
/// Copy and transform a file descriptor
|
||||
pub fn dup2(fd: usize, newfd: usize, buf: &[u8]) -> Result<usize> {
|
||||
unsafe { syscall4(SYS_DUP2, fd, newfd, buf.as_ptr() as usize, buf.len()) }
|
||||
}
|
||||
|
||||
/// Replace the current process with a new executable
|
||||
pub fn execve(path: &str, args: &[[usize; 2]]) -> Result<usize> {
|
||||
unsafe { syscall4(SYS_EXECVE, path.as_ptr() as usize, path.len(),
|
||||
|
@ -28,6 +28,7 @@ pub const SYS_UNLINK: usize = SYS_CLASS_PATH | 10;
|
||||
|
||||
pub const SYS_CLOSE: usize = SYS_CLASS_FILE | 6;
|
||||
pub const SYS_DUP: usize = SYS_CLASS_FILE | SYS_RET_FILE | 41;
|
||||
pub const SYS_DUP2: usize = SYS_CLASS_FILE | SYS_RET_FILE | 63;
|
||||
pub const SYS_READ: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 3;
|
||||
pub const SYS_WRITE: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 4;
|
||||
pub const SYS_LSEEK: usize = SYS_CLASS_FILE | 19;
|
||||
|
Loading…
x
Reference in New Issue
Block a user