mirror of git://git.musl-libc.org/musl
fix integer overflow in WIFSTOPPED macro
the result of the 0xffff mask with the exit status could have bit 15 set, in which case multiplying by 0x10001 overflows 32-bit signed int. making the multiply unsigned avoids the overflow. it also changes the sign extension behavior of the subsequent >> operation, but the affected bits are all unwanted anyway and all discarded by the cast to short.
This commit is contained in:
parent
f897461d4f
commit
ea3b40a321
|
@ -95,7 +95,7 @@ size_t __ctype_get_mb_cur_max(void);
|
|||
#define WTERMSIG(s) ((s) & 0x7f)
|
||||
#define WSTOPSIG(s) WEXITSTATUS(s)
|
||||
#define WIFEXITED(s) (!WTERMSIG(s))
|
||||
#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001)>>8) > 0x7f00)
|
||||
#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001U)>>8) > 0x7f00)
|
||||
#define WIFSIGNALED(s) (((s)&0xffff)-1U < 0xffu)
|
||||
|
||||
int posix_memalign (void **, size_t, size_t);
|
||||
|
|
|
@ -50,7 +50,7 @@ pid_t wait4 (pid_t, int *, int, struct rusage *);
|
|||
#define WSTOPSIG(s) WEXITSTATUS(s)
|
||||
#define WCOREDUMP(s) ((s) & 0x80)
|
||||
#define WIFEXITED(s) (!WTERMSIG(s))
|
||||
#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001)>>8) > 0x7f00)
|
||||
#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001U)>>8) > 0x7f00)
|
||||
#define WIFSIGNALED(s) (((s)&0xffff)-1U < 0xffu)
|
||||
#define WIFCONTINUED(s) ((s) == 0xffff)
|
||||
|
||||
|
|
Loading…
Reference in New Issue