Commit e3c5cf66 authored by Maria Matejka's avatar Maria Matejka Committed by Maria Matejka
Browse files

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.
parent 3cf4d419
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -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)
{
+3 −3
Original line number Diff line number Diff line
@@ -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)
+4 −3
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#define _BIRD_UNIX_H_

#include <sys/socket.h>
#include <signal.h>

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);
+5 −0
Original line number Diff line number Diff line
@@ -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;