diff options
author | Maria Matejka <mq@ucw.cz> | 2019-10-04 12:20:02 +0200 |
---|---|---|
committer | Maria Matejka <mq@jmq.cz> | 2019-10-04 20:52:07 +0200 |
commit | 24493e9169d3058958ab3ec4d2b02c5753954981 (patch) | |
tree | c50c972dc4b0362ca77d9887ddc93a3372036653 /sysdep/unix | |
parent | 4821251ebb13c05e8752f6f54b8e5ad6d87fecaa (diff) |
Fixed undefined behavior on signals.
The C11 specification allows only sig_atomic_t and _Atomic variable
access. All other accesses to global variables are undefined behavior.
Using int was probably OK on x86 and x86_64; yet there were some reports
from other architectures (especially some MIPS) that in rare cases,
after issuing SIGHUP, BIRD did strange things.
Diffstat (limited to 'sysdep/unix')
-rw-r--r-- | sysdep/unix/io.c | 4 | ||||
-rw-r--r-- | sysdep/unix/main.c | 6 | ||||
-rw-r--r-- | sysdep/unix/unix.h | 7 |
3 files changed, 7 insertions, 10 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index c9fee3ab..5e4d9573 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -2154,10 +2154,6 @@ watchdog_stop(void) * Main I/O Loop */ -volatile int async_config_flag; /* Asynchronous reconfiguration/dump scheduled */ -volatile int async_dump_flag; -volatile int async_shutdown_flag; - void io_init(void) { diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index db848033..a52ae3ca 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -601,9 +601,9 @@ cmd_graceful_restart(void) * Signals */ -volatile int async_config_flag; -volatile int async_dump_flag; -volatile int async_shutdown_flag; +volatile sig_atomic_t async_config_flag; +volatile sig_atomic_t async_dump_flag; +volatile sig_atomic_t async_shutdown_flag; static void handle_sighup(int sig UNUSED) diff --git a/sysdep/unix/unix.h b/sysdep/unix/unix.h index bf0aedeb..bd817bf2 100644 --- a/sysdep/unix/unix.h +++ b/sysdep/unix/unix.h @@ -10,6 +10,7 @@ #define _BIRD_UNIX_H_ #include <sys/socket.h> +#include <signal.h> struct pool; struct iface; @@ -97,9 +98,9 @@ int sockaddr_read(sockaddr *sa, int af, ip_addr *a, struct iface **ifa, uint *po #define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) + strlen ((ptr)->sun_path)) #endif -extern volatile int async_config_flag; -extern volatile int async_dump_flag; -extern volatile int async_shutdown_flag; +extern volatile sig_atomic_t async_config_flag; +extern volatile sig_atomic_t async_dump_flag; +extern volatile sig_atomic_t async_shutdown_flag; void io_init(void); void io_loop(void); |