commit 08bbce9923aec1eee0e6879c198b06c1b8f87d35 Author: Jacob Welsh AuthorDate: Mon Oct 27 16:44:23 2025 +0000 Commit: Jacob Welsh CommitDate: Tue Oct 28 01:16:53 2025 +0000 busybox: use volatile sig_atomic_t for global written from signal handler, per standard C. This could fix a theoretical optimization-dependent situation where an applet fails to detect a signal because bb_got_signal isn't refreshed from memory. Previously noted in: http://jfxpt.com/2022/busybox-microcom-the-code-review/ Text size +18 bytes on amd64, Gales configuration. diff --git a/base/busybox/include/libbb.h b/base/busybox/include/libbb.h index a08b3e1..8ef87b7 100644 --- a/base/busybox/include/libbb.h +++ b/base/busybox/include/libbb.h @@ -482,7 +482,7 @@ int sigaction_set(int sig, const struct sigaction *act) FAST_FUNC; /* SIG_BLOCK/SIG_UNBLOCK all signals: */ int sigprocmask_allsigs(int how) FAST_FUNC; /* Standard handler which just records signo */ -extern smallint bb_got_signal; +extern volatile sig_atomic_t bb_got_signal; void record_signo(int signo); /* not FAST_FUNC! */ diff --git a/base/busybox/init/init.c b/base/busybox/init/init.c index 80c5d0f..634168d 100644 --- a/base/busybox/init/init.c +++ b/base/busybox/init/init.c @@ -866,7 +866,7 @@ static void exec_restart_action(void) */ static void stop_handler(int sig UNUSED_PARAM) { - smallint saved_bb_got_signal; + int saved_bb_got_signal; int saved_errno; saved_bb_got_signal = bb_got_signal; @@ -959,7 +959,7 @@ static int check_delayed_sigs(void) int sigs_seen = 0; while (1) { - smallint sig = bb_got_signal; + int sig = bb_got_signal; if (!sig) return sigs_seen; diff --git a/base/busybox/libbb/signals.c b/base/busybox/libbb/signals.c index 5651247..d7eb849 100644 --- a/base/busybox/libbb/signals.c +++ b/base/busybox/libbb/signals.c @@ -11,8 +11,8 @@ #include "libbb.h" -/* All known arches use small ints for signals */ -smallint bb_got_signal; +/* Was smallint (not even volatile) because "all known arches use small ints for signals". Be that as it may, it seems a weak support for venturing into undefined behavior per C89. */ +volatile sig_atomic_t bb_got_signal; void record_signo(int signo) {