aboutsummaryrefslogtreecommitdiffstats
path: root/sysdep
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2019-10-04 12:20:02 +0200
committerMaria Matejka <mq@jmq.cz>2019-10-04 20:52:07 +0200
commit24493e9169d3058958ab3ec4d2b02c5753954981 (patch)
treec50c972dc4b0362ca77d9887ddc93a3372036653 /sysdep
parent4821251ebb13c05e8752f6f54b8e5ad6d87fecaa (diff)
downloadbird-24493e9169d3058958ab3ec4d2b02c5753954981.tar.gz
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')
-rw-r--r--sysdep/unix/io.c4
-rw-r--r--sysdep/unix/main.c6
-rw-r--r--sysdep/unix/unix.h7
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);