Commit 94b5d51b by Christian Brauner Committed by Stéphane Graber

lxc_monitord: make lxc-monitord async signal safe

Before lxc_monitord called lxc_monitord_cleanup() from a signal handler. This function calls a bunch of async signal unsafe functions and basically begs for deadlocks. This commit switches lxc-monitord to using sigsetjmp() and siglongjmp() in the signal handler to jump to a cleanup label that call lxc_monitord_cleanup(). In this way, we avoid using async signal unsafe functions. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 7c51e617
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <unistd.h> #include <unistd.h>
#include <net/if.h> #include <net/if.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <setjmp.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/socket.h> #include <sys/socket.h>
...@@ -48,6 +49,8 @@ ...@@ -48,6 +49,8 @@
lxc_log_define(lxc_monitord, lxc); lxc_log_define(lxc_monitord, lxc);
sigjmp_buf mark;
static void lxc_monitord_cleanup(void); static void lxc_monitord_cleanup(void);
/* /*
...@@ -336,9 +339,7 @@ static void lxc_monitord_cleanup(void) ...@@ -336,9 +339,7 @@ static void lxc_monitord_cleanup(void)
static void lxc_monitord_sig_handler(int sig) static void lxc_monitord_sig_handler(int sig)
{ {
INFO("Caught signal %d.", sig); siglongjmp(mark, 1);
lxc_monitord_cleanup();
exit(EXIT_SUCCESS);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
...@@ -384,6 +385,9 @@ int main(int argc, char *argv[]) ...@@ -384,6 +385,9 @@ int main(int argc, char *argv[])
signal(SIGBUS, lxc_monitord_sig_handler); signal(SIGBUS, lxc_monitord_sig_handler);
signal(SIGTERM, lxc_monitord_sig_handler); signal(SIGTERM, lxc_monitord_sig_handler);
if (sigsetjmp(mark, 1) != 0)
goto on_signal;
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
memset(&mon, 0, sizeof(mon)); memset(&mon, 0, sizeof(mon));
mon.lxcpath = lxcpath; mon.lxcpath = lxcpath;
...@@ -427,4 +431,8 @@ int main(int argc, char *argv[]) ...@@ -427,4 +431,8 @@ int main(int argc, char *argv[])
on_error: on_error:
exit(ret); exit(ret);
on_signal:
lxc_monitord_cleanup();
exit(EXIT_SUCCESS);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment