Skip to content

Commit

Permalink
Auto merge of #472 - BrandonSchaefer:wifsignaled-fix, r=alexcrichton
Browse files Browse the repository at this point in the history
When checking the status from waitpid on a kill -STOP <child_pid> WIFSIGNALED returns true

Currently in WIFSIGNALED rust is doing:
(status & 0x7f) + 1
where status is i32

As defined in /usr/include/x86_64-linux-gnu/bits/waitstatus.h
#define __WIFSIGNALED(status) \
  (((signed char) (((status) & 0x7f) + 1) >> 1) > 0)

Here is an example of the issue:
http://paste2.org/fXc8BxJ0

Run it, and it'll print the child pid then:
kill -STOP <child_pid>

Expect:
  Stopped by signal print statement
Results:
  Killed by signal print statement

Using the i32, it wont overflow leaving you with 128 returning true, using the waitstatus define you'll end up with -64 (since it shifts 1 right) which would return false. Though the C version shifts right once not really sure *why* but theres most likely a reason somewhere.

For the fix, just cast to i8 (signed char pretty much) as the C version is doing.

RUNNING ALL TESTS
PASSED 7356 tests
  • Loading branch information
bors committed Dec 13, 2016
2 parents 2d86489 + 9f6f374 commit fb8587d
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/unix/notbsd/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -685,7 +685,7 @@ f! {
}

pub fn WIFSIGNALED(status: ::c_int) -> bool {
(status & 0x7f) + 1 >= 2
((status & 0x7f) + 1) as i8 >= 2
}

pub fn WTERMSIG(status: ::c_int) -> ::c_int {
Expand Down

0 comments on commit fb8587d

Please sign in to comment.