From: Maria Matejka Date: Fri, 4 Oct 2019 10:20:02 +0000 (+0200) Subject: Fixed undefined behavior on signals. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3c5cf66371eff4f4bc686c337da2f2494734d01;p=thirdparty%2Fbird.git 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. --- diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index 8f76652ad..d2f1f205b 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -2144,10 +2144,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 a898a19a8..0624e7b37 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -583,9 +583,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 7e3a9fede..1490243cb 100644 --- a/sysdep/unix/unix.h +++ b/sysdep/unix/unix.h @@ -10,6 +10,7 @@ #define _BIRD_UNIX_H_ #include +#include struct pool; struct iface; @@ -96,9 +97,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); diff --git a/test/birdtest.c b/test/birdtest.c index 823b02ff6..ede4eb527 100644 --- a/test/birdtest.c +++ b/test/birdtest.c @@ -35,6 +35,11 @@ static int no_fork; static int no_timeout; static int is_terminal; /* Whether stdout is a live terminal or pipe redirect */ +volatile sig_atomic_t async_config_flag; /* Asynchronous reconfiguration/dump scheduled */ +volatile sig_atomic_t async_dump_flag; +volatile sig_atomic_t async_shutdown_flag; + + uint bt_verbose; const char *bt_filename; const char *bt_test_id;