diff options
| author | Benjamin Herr <ben@0x539.de> | 2014-10-02 20:55:26 +0200 |
|---|---|---|
| committer | Benjamin Herr <ben@0x539.de> | 2014-10-02 21:16:37 +0200 |
| commit | af633ce157082bf2b0fd0577765e9b49c34c3e90 (patch) | |
| tree | 2f20450b85cbc3b335a321aefba65989f8ca0677 /src/libnative | |
| parent | dd7f00de801e4ca24c9c1235227ace4f998d4b1c (diff) | |
| download | rust-af633ce157082bf2b0fd0577765e9b49c34c3e90.tar.gz rust-af633ce157082bf2b0fd0577765e9b49c34c3e90.zip | |
native: fix passing errno to parent after fork
The bitshifts were wrong in that they invoked undefined behavior and only passed the lower byte of the presumed-to-be-32bit errno value. Apparently all actually possible values for errno happen to be easily under 256, so this didn't cause any actual problems. This commit fixes the bitshifts, but doesn't generalize to errno types that aren't 32bit.
Diffstat (limited to 'src/libnative')
| -rw-r--r-- | src/libnative/io/process.rs | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/libnative/io/process.rs b/src/libnative/io/process.rs index 3a6ae42f946..7a0c1c35d65 100644 --- a/src/libnative/io/process.rs +++ b/src/libnative/io/process.rs @@ -583,10 +583,11 @@ fn spawn_process_os(cfg: ProcessConfig, let mut bytes = [0, ..4]; return match input.inner_read(bytes) { Ok(4) => { - let errno = (bytes[0] << 24) as i32 | - (bytes[1] << 16) as i32 | - (bytes[2] << 8) as i32 | - (bytes[3] << 0) as i32; + let errno = (bytes[0] as i32 << 24) | + (bytes[1] as i32 << 16) | + (bytes[2] as i32 << 8) | + (bytes[3] as i32 << 0); + Err(IoError { code: errno as uint, detail: None, @@ -637,10 +638,10 @@ fn spawn_process_os(cfg: ProcessConfig, fn fail(output: &mut file::FileDesc) -> ! { let errno = os::errno(); let bytes = [ - (errno << 24) as u8, - (errno << 16) as u8, - (errno << 8) as u8, - (errno << 0) as u8, + (errno >> 24) as u8, + (errno >> 16) as u8, + (errno >> 8) as u8, + (errno >> 0) as u8, ]; assert!(output.inner_write(bytes).is_ok()); unsafe { libc::_exit(1) } |
