about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2023-01-18 23:15:58 -0500
committerRich Felker <dalias@aerifal.cx>2023-02-08 16:42:28 -0500
commitea3b40a321e751e016948087ef23ae7b9e8e0150 (patch)
treef4c353f26002191d8cfdb80e77aa1491773f4622
parentf897461d4fe72bb71854a6d0662de83008caccb7 (diff)
downloadmusl-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.h2
-rw-r--r--include/sys/wait.h2
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)