[PATCH] tools/nolibc: Fix WIFSIGNALED(0)

From: Daniel Palmer

Date: Sun Oct 18 2026 - 06:56:16 EST


WIFSIGNALED(0) currently returns true, so a process that exited
normally with status 0 looks like it was killed by a signal.

The macro uses a trick of checking whether status - 1 is below
0xff but is subtly broken because of using signed arithmetic.
For 0 it computes -1 < 0xff which is true.

Do what musl does: mask the status to 16 bits and use unsigned
arithmetic so 0 wraps to 0xffff and the comparison fails.
The mask also prevents bits we don't care about from sneaking in.

Fixes: 8c934d4822c7 ("tools/nolibc: add helpers for wait() signal exits")
Signed-off-by: Daniel Palmer <daniel@xxxxxxxxx>
---

I'm putting off sending anything else (dirfd and some other bits)
until after the merge window has finished.. but this one seems like
it should be fixed sooner.

I found this while debugging an annoying issue in my homebrew nolibc
based shell.

tools/include/nolibc/types.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/include/nolibc/types.h b/tools/include/nolibc/types.h
index 8f3cb18df7f1..d241629b9e67 100644
--- a/tools/include/nolibc/types.h
+++ b/tools/include/nolibc/types.h
@@ -119,7 +119,7 @@ struct timeval {
#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
#define WIFEXITED(status) (((status) & 0x7f) == 0)
#define WTERMSIG(status) ((status) & 0x7f)
-#define WIFSIGNALED(status) ((status) - 1 < 0xff)
+#define WIFSIGNALED(status) (((status) & 0xffff) - 1U < 0xffU)

/* standard exit() codes */
#define EXIT_SUCCESS 0
--
2.53.0