Temporary workaround for BSD WEXITSTATUS libc bug

The libc crate has a bug on BSD where WEXITSTATUS is not an 8-bit
value, causing assertion failures.

Any libc higher than our 0.2.155 would increase our MSRV, see libc
commit 5ddbdc29f (Bump MSRV to 1.71, 2024-01-07), so we want to
woraround this anyway.  It's probably not worth using a patched
version of libc since it's just one line.

While at it, tighten some types I guess.

Upstream fix: https://github.com/rust-lang/libc/pull/4213

Closes #10919
This commit is contained in:
Johannes Altmanninger 2024-12-19 07:57:03 +01:00
parent 5de6f4bb3d
commit c1b460525c

View file

@ -233,14 +233,14 @@ impl ProcStatus {
} }
/// Return the exit code, given that we normal exited. /// Return the exit code, given that we normal exited.
pub fn exit_code(&self) -> libc::c_int { pub fn exit_code(&self) -> u8 {
assert!(self.normal_exited(), "Process is not normal exited"); assert!(self.normal_exited(), "Process is not normal exited");
WEXITSTATUS(self.status()) u8::try_from(WEXITSTATUS(self.status()) & 0xff).unwrap() // Workaround for libc bug
} }
/// Return if this status represents success. /// Return if this status represents success.
pub fn is_success(&self) -> bool { pub fn is_success(&self) -> bool {
self.normal_exited() && self.exit_code() == EXIT_SUCCESS self.normal_exited() && self.exit_code() == u8::try_from(EXIT_SUCCESS).unwrap()
} }
/// Return the value appropriate to populate $status. /// Return the value appropriate to populate $status.
@ -248,7 +248,7 @@ impl ProcStatus {
if self.signal_exited() { if self.signal_exited() {
128 + self.signal_code() 128 + self.signal_code()
} else if self.normal_exited() { } else if self.normal_exited() {
self.exit_code() i32::from(self.exit_code())
} else { } else {
panic!("Process is not exited") panic!("Process is not exited")
} }