Skip to content

Commit

Permalink
Revert "Do not call getpid wrapper after fork in tests"
Browse files Browse the repository at this point in the history
This reverts commit 12fbabd.

It was only needed because of using raw `clone3` instead of `fork`, but
we only do that now when a pidfd is requested.
  • Loading branch information
cuviper committed Nov 5, 2021
1 parent 6edaaa6 commit e96a0a8
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 35 deletions.
25 changes: 6 additions & 19 deletions src/test/ui/command/command-pre-exec.rs
Expand Up @@ -8,30 +8,15 @@
// ignore-sgx no processes
#![feature(process_exec, rustc_private)]

extern crate libc;

use std::env;
use std::io::Error;
use std::os::unix::process::CommandExt;
use std::process::Command;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;

#[cfg(not(target_os = "linux"))]
fn getpid() -> u32 {
use std::process;
process::id()
}

/// We need to directly use the getpid syscall instead of using `process::id()`
/// because the libc wrapper might return incorrect values after a process was
/// forked.
#[cfg(target_os = "linux")]
fn getpid() -> u32 {
extern crate libc;
unsafe {
libc::syscall(libc::SYS_getpid) as _
}
}

fn main() {
if let Some(arg) = env::args().nth(1) {
match &arg[..] {
Expand Down Expand Up @@ -83,12 +68,14 @@ fn main() {
};
assert_eq!(output.raw_os_error(), Some(102));

let pid = getpid();
let pid = unsafe { libc::getpid() };
assert!(pid >= 0);
let output = unsafe {
Command::new(&me)
.arg("empty")
.pre_exec(move || {
let child = getpid();
let child = libc::getpid();
assert!(child >= 0);
assert!(pid != child);
Ok(())
})
Expand Down
17 changes: 1 addition & 16 deletions src/test/ui/process/process-panic-after-fork.rs
Expand Up @@ -23,21 +23,6 @@ use std::sync::atomic::{AtomicU32, Ordering};

use libc::c_int;

#[cfg(not(target_os = "linux"))]
fn getpid() -> u32 {
process::id()
}

/// We need to directly use the getpid syscall instead of using `process::id()`
/// because the libc wrapper might return incorrect values after a process was
/// forked.
#[cfg(target_os = "linux")]
fn getpid() -> u32 {
unsafe {
libc::syscall(libc::SYS_getpid) as _
}
}

/// This stunt allocator allows us to spot heap allocations in the child.
struct PidChecking<A> {
parent: A,
Expand All @@ -59,7 +44,7 @@ impl<A> PidChecking<A> {
fn check(&self) {
let require_pid = self.require_pid.load(Ordering::Acquire);
if require_pid != 0 {
let actual_pid = getpid();
let actual_pid = process::id();
if require_pid != actual_pid {
unsafe {
libc::raise(libc::SIGUSR1);
Expand Down

0 comments on commit e96a0a8

Please sign in to comment.