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.
This commit is contained in:
Maria Matejka 2019-10-04 12:20:02 +02:00 committed by Maria Matejka
parent 4821251ebb
commit 24493e9169
4 changed files with 12 additions and 10 deletions

View file

@ -2154,10 +2154,6 @@ watchdog_stop(void)
* Main I/O Loop * Main I/O Loop
*/ */
volatile int async_config_flag; /* Asynchronous reconfiguration/dump scheduled */
volatile int async_dump_flag;
volatile int async_shutdown_flag;
void void
io_init(void) io_init(void)
{ {

View file

@ -601,9 +601,9 @@ cmd_graceful_restart(void)
* Signals * Signals
*/ */
volatile int async_config_flag; volatile sig_atomic_t async_config_flag;
volatile int async_dump_flag; volatile sig_atomic_t async_dump_flag;
volatile int async_shutdown_flag; volatile sig_atomic_t async_shutdown_flag;
static void static void
handle_sighup(int sig UNUSED) handle_sighup(int sig UNUSED)

View file

@ -10,6 +10,7 @@
#define _BIRD_UNIX_H_ #define _BIRD_UNIX_H_
#include <sys/socket.h> #include <sys/socket.h>
#include <signal.h>
struct pool; struct pool;
struct iface; 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)) #define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) + strlen ((ptr)->sun_path))
#endif #endif
extern volatile int async_config_flag; extern volatile sig_atomic_t async_config_flag;
extern volatile int async_dump_flag; extern volatile sig_atomic_t async_dump_flag;
extern volatile int async_shutdown_flag; extern volatile sig_atomic_t async_shutdown_flag;
void io_init(void); void io_init(void);
void io_loop(void); void io_loop(void);

View file

@ -36,6 +36,11 @@ static int no_fork;
static int no_timeout; static int no_timeout;
static int is_terminal; /* Whether stdout is a live terminal or pipe redirect */ 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; uint bt_verbose;
const char *bt_filename; const char *bt_filename;
const char *bt_test_id; const char *bt_test_id;