diff options
author | Rich Felker <dalias@aerifal.cx> | 2023-01-18 23:15:58 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2023-02-08 16:42:28 -0500 |
commit | ea3b40a321e751e016948087ef23ae7b9e8e0150 (patch) | |
tree | f4c353f26002191d8cfdb80e77aa1491773f4622 | |
parent | f897461d4fe72bb71854a6d0662de83008caccb7 (diff) | |
download | musl-ea3b40a321e751e016948087ef23ae7b9e8e0150.tar.gz musl-ea3b40a321e751e016948087ef23ae7b9e8e0150.tar.xz musl-ea3b40a321e751e016948087ef23ae7b9e8e0150.zip |
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.
-rw-r--r-- | include/stdlib.h | 2 | ||||
-rw-r--r-- | include/sys/wait.h | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/include/stdlib.h b/include/stdlib.h index b117a452..475190bf 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -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); diff --git a/include/sys/wait.h b/include/sys/wait.h index d4b1f2e1..8ced671b 100644 --- a/include/sys/wait.h +++ b/include/sys/wait.h @@ -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) |