Skip to content

Commit

Permalink
Rollup merge of #74271 - lzutao:cmdbytes, r=LukasKalbertodt
Browse files Browse the repository at this point in the history
process_unix: prefer i32::*_be_bytes over manually shifting bytes

This PR makes it more clear about the intend of the code.
  • Loading branch information
Manishearth authored Jul 14, 2020
2 parents fadd91c + 879afd5 commit 7b1247c
Showing 1 changed file with 12 additions and 14 deletions.
26 changes: 12 additions & 14 deletions src/libstd/sys/unix/process/process_unix.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::convert::TryInto;
use crate::fmt;
use crate::io::{self, Error, ErrorKind};
use crate::ptr;
Expand All @@ -17,7 +18,7 @@ impl Command {
default: Stdio,
needs_stdin: bool,
) -> io::Result<(Process, StdioPipes)> {
const CLOEXEC_MSG_FOOTER: &[u8] = b"NOEX";
const CLOEXEC_MSG_FOOTER: [u8; 4] = *b"NOEX";

let envp = self.capture_env();

Expand Down Expand Up @@ -52,11 +53,12 @@ impl Command {
drop(input);
let Err(err) = self.do_exec(theirs, envp.as_ref());
let errno = err.raw_os_error().unwrap_or(libc::EINVAL) as u32;
let errno = errno.to_be_bytes();
let bytes = [
(errno >> 24) as u8,
(errno >> 16) as u8,
(errno >> 8) as u8,
(errno >> 0) as u8,
errno[0],
errno[1],
errno[2],
errno[3],
CLOEXEC_MSG_FOOTER[0],
CLOEXEC_MSG_FOOTER[1],
CLOEXEC_MSG_FOOTER[2],
Expand All @@ -81,12 +83,13 @@ impl Command {
match input.read(&mut bytes) {
Ok(0) => return Ok((p, ours)),
Ok(8) => {
let (errno, footer) = bytes.split_at(4);
assert!(
combine(CLOEXEC_MSG_FOOTER) == combine(&bytes[4..8]),
combine(CLOEXEC_MSG_FOOTER) == combine(footer.try_into().unwrap()),
"Validation on the CLOEXEC pipe failed: {:?}",
bytes
);
let errno = combine(&bytes[0..4]);
let errno = combine(errno.try_into().unwrap());
assert!(p.wait().is_ok(), "wait() should either return Ok or panic");
return Err(Error::from_raw_os_error(errno));
}
Expand All @@ -103,13 +106,8 @@ impl Command {
}
}

fn combine(arr: &[u8]) -> i32 {
let a = arr[0] as u32;
let b = arr[1] as u32;
let c = arr[2] as u32;
let d = arr[3] as u32;

((a << 24) | (b << 16) | (c << 8) | (d << 0)) as i32
fn combine(arr: [u8; 4]) -> i32 {
i32::from_be_bytes(arr)
}
}

Expand Down

0 comments on commit 7b1247c

Please sign in to comment.