about summary refs log tree commit diff
path: root/src/libnative
diff options
context:
space:
mode:
authorBenjamin Herr <ben@0x539.de>2014-10-02 20:55:26 +0200
committerBenjamin Herr <ben@0x539.de>2014-10-02 21:16:37 +0200
commitaf633ce157082bf2b0fd0577765e9b49c34c3e90 (patch)
tree2f20450b85cbc3b335a321aefba65989f8ca0677 /src/libnative
parentdd7f00de801e4ca24c9c1235227ace4f998d4b1c (diff)
downloadrust-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.rs17
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) }