|
 |
cead2e |
From 19d0482859d9068b893104b9f8beeaba709aec2d Mon Sep 17 00:00:00 2001
|
|
 |
cead2e |
From: Quentin Armitage <quentin@armitage.org.uk>
|
|
 |
cead2e |
Date: Mon, 27 Mar 2017 11:28:02 +0100
|
|
 |
cead2e |
Subject: [PATCH 2/3] Don't segfault if unable to load ip_vs module
|
|
 |
cead2e |
|
|
 |
cead2e |
In a docker container it isn't possible to load a kernel module. The
|
|
 |
cead2e |
check code was detecting that it couldn't load the module, but the
|
|
 |
cead2e |
checker process, when cleaning up prior to exiting, was assuming that
|
|
 |
cead2e |
certain pointers had been initialised which hadn't been when an error
|
|
 |
cead2e |
was detected so early in the initialisation.
|
|
 |
cead2e |
|
|
 |
cead2e |
This commit adds testing for uninitialised pointers during the exit
|
|
 |
cead2e |
sequence.
|
|
 |
cead2e |
|
|
 |
cead2e |
Signed-off-by: Quentin Armitage <quentin@armitage.org.uk>
|
|
 |
cead2e |
---
|
|
 |
cead2e |
keepalived/check/check_api.c | 3 +++
|
|
 |
cead2e |
keepalived/check/check_daemon.c | 8 +++++---
|
|
 |
cead2e |
keepalived/check/check_data.c | 7 ++++++-
|
|
 |
cead2e |
keepalived/check/ipvswrapper.c | 9 ++++++---
|
|
 |
cead2e |
keepalived/check/ipwrapper.c | 6 ++++--
|
|
 |
cead2e |
keepalived/check/libipvs.c | 5 ++++-
|
|
 |
cead2e |
keepalived/core/keepalived_netlink.c | 7 ++++---
|
|
 |
cead2e |
7 files changed, 32 insertions(+), 13 deletions(-)
|
|
 |
cead2e |
|
|
 |
cead2e |
diff --git a/keepalived/check/check_api.c b/keepalived/check/check_api.c
|
|
 |
cead2e |
index 51d8cc71..b7081fd0 100644
|
|
 |
cead2e |
--- a/keepalived/check/check_api.c
|
|
 |
cead2e |
+++ b/keepalived/check/check_api.c
|
|
 |
cead2e |
@@ -224,6 +224,9 @@ init_checkers_queue(void)
|
|
 |
cead2e |
void
|
|
 |
cead2e |
free_checkers_queue(void)
|
|
 |
cead2e |
{
|
|
 |
cead2e |
+ if (!checkers_queue)
|
|
 |
cead2e |
+ return;
|
|
 |
cead2e |
+
|
|
 |
cead2e |
free_list(&checkers_queue);
|
|
 |
cead2e |
ncheckers = 0;
|
|
 |
cead2e |
}
|
|
 |
cead2e |
diff --git a/keepalived/check/check_daemon.c b/keepalived/check/check_daemon.c
|
|
 |
cead2e |
index a87fd4cd..a3ff8cab 100644
|
|
 |
cead2e |
--- a/keepalived/check/check_daemon.c
|
|
 |
cead2e |
+++ b/keepalived/check/check_daemon.c
|
|
 |
cead2e |
@@ -74,7 +74,7 @@ stop_check(int status)
|
|
 |
cead2e |
clear_services();
|
|
 |
cead2e |
ipvs_stop();
|
|
 |
cead2e |
#ifdef _WITH_SNMP_CHECKER_
|
|
 |
cead2e |
- if (global_data->enable_snmp_checker)
|
|
 |
cead2e |
+ if (global_data && global_data->enable_snmp_checker)
|
|
 |
cead2e |
check_snmp_agent_close();
|
|
 |
cead2e |
#endif
|
|
 |
cead2e |
|
|
 |
cead2e |
@@ -82,8 +82,10 @@ stop_check(int status)
|
|
 |
cead2e |
pidfile_rm(checkers_pidfile);
|
|
 |
cead2e |
|
|
 |
cead2e |
/* Clean data */
|
|
 |
cead2e |
- free_global_data(global_data);
|
|
 |
cead2e |
- free_check_data(check_data);
|
|
 |
cead2e |
+ if (global_data)
|
|
 |
cead2e |
+ free_global_data(global_data);
|
|
 |
cead2e |
+ if (check_data)
|
|
 |
cead2e |
+ free_check_data(check_data);
|
|
 |
cead2e |
free_parent_mallocs_exit();
|
|
 |
cead2e |
|
|
 |
cead2e |
/*
|
|
 |
cead2e |
diff --git a/keepalived/check/check_data.c b/keepalived/check/check_data.c
|
|
 |
cead2e |
index 0c3f1940..6ce87229 100644
|
|
 |
cead2e |
--- a/keepalived/check/check_data.c
|
|
 |
cead2e |
+++ b/keepalived/check/check_data.c
|
|
 |
cead2e |
@@ -51,7 +51,12 @@ alloc_ssl(void)
|
|
 |
cead2e |
void
|
|
 |
cead2e |
free_ssl(void)
|
|
 |
cead2e |
{
|
|
 |
cead2e |
- ssl_data_t *ssl = check_data->ssl;
|
|
 |
cead2e |
+ ssl_data_t *ssl;
|
|
 |
cead2e |
+
|
|
 |
cead2e |
+ if (!check_data)
|
|
 |
cead2e |
+ return;
|
|
 |
cead2e |
+
|
|
 |
cead2e |
+ ssl = check_data->ssl;
|
|
 |
cead2e |
|
|
 |
cead2e |
if (!ssl)
|
|
 |
cead2e |
return;
|
|
 |
cead2e |
diff --git a/keepalived/check/ipvswrapper.c b/keepalived/check/ipvswrapper.c
|
|
 |
cead2e |
index cd7f169e..20757c94 100644
|
|
 |
cead2e |
--- a/keepalived/check/ipvswrapper.c
|
|
 |
cead2e |
+++ b/keepalived/check/ipvswrapper.c
|
|
 |
cead2e |
@@ -165,9 +165,12 @@ void
|
|
 |
cead2e |
ipvs_stop(void)
|
|
 |
cead2e |
{
|
|
 |
cead2e |
/* Clean up the room */
|
|
 |
cead2e |
- FREE(srule);
|
|
 |
cead2e |
- FREE(drule);
|
|
 |
cead2e |
- FREE(daemonrule);
|
|
 |
cead2e |
+ if (srule)
|
|
 |
cead2e |
+ FREE(srule);
|
|
 |
cead2e |
+ if (drule)
|
|
 |
cead2e |
+ FREE(drule);
|
|
 |
cead2e |
+ if (daemonrule)
|
|
 |
cead2e |
+ FREE(daemonrule);
|
|
 |
cead2e |
ipvs_close();
|
|
 |
cead2e |
}
|
|
 |
cead2e |
|
|
 |
cead2e |
diff --git a/keepalived/check/ipwrapper.c b/keepalived/check/ipwrapper.c
|
|
 |
cead2e |
index 0c2fc46b..ecf12713 100644
|
|
 |
cead2e |
--- a/keepalived/check/ipwrapper.c
|
|
 |
cead2e |
+++ b/keepalived/check/ipwrapper.c
|
|
 |
cead2e |
@@ -138,10 +138,12 @@ void
|
|
 |
cead2e |
clear_services(void)
|
|
 |
cead2e |
{
|
|
 |
cead2e |
element e;
|
|
 |
cead2e |
- list l = check_data->vs;
|
|
 |
cead2e |
virtual_server_t *vs;
|
|
 |
cead2e |
|
|
 |
cead2e |
- for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) {
|
|
 |
cead2e |
+ if (!check_data || !check_data->vs)
|
|
 |
cead2e |
+ return;
|
|
 |
cead2e |
+
|
|
 |
cead2e |
+ for (e = LIST_HEAD(check_data->vs); e; ELEMENT_NEXT(e)) {
|
|
 |
cead2e |
vs = ELEMENT_DATA(e);
|
|
 |
cead2e |
clear_service_vs(vs);
|
|
 |
cead2e |
}
|
|
 |
cead2e |
diff --git a/keepalived/check/libipvs.c b/keepalived/check/libipvs.c
|
|
 |
cead2e |
index 2250e2b4..8722f7a6 100644
|
|
 |
cead2e |
--- a/keepalived/check/libipvs.c
|
|
 |
cead2e |
+++ b/keepalived/check/libipvs.c
|
|
 |
cead2e |
@@ -1157,7 +1157,10 @@ void ipvs_close(void)
|
|
 |
cead2e |
if (try_nl)
|
|
 |
cead2e |
return;
|
|
 |
cead2e |
#endif
|
|
 |
cead2e |
- close(sockfd);
|
|
 |
cead2e |
+ if (sockfd != -1) {
|
|
 |
cead2e |
+ close(sockfd);
|
|
 |
cead2e |
+ sockfd = -1;
|
|
 |
cead2e |
+ }
|
|
 |
cead2e |
}
|
|
 |
cead2e |
|
|
 |
cead2e |
const char *ipvs_strerror(int err)
|
|
 |
cead2e |
diff --git a/keepalived/core/keepalived_netlink.c b/keepalived/core/keepalived_netlink.c
|
|
 |
cead2e |
index 41e63b85..0f465cf5 100644
|
|
 |
cead2e |
--- a/keepalived/core/keepalived_netlink.c
|
|
 |
cead2e |
+++ b/keepalived/core/keepalived_netlink.c
|
|
 |
cead2e |
@@ -251,9 +251,12 @@ netlink_socket(nl_handle_t *nl, int flags, int group, ...)
|
|
 |
cead2e |
}
|
|
 |
cead2e |
|
|
 |
cead2e |
/* Close a netlink socket */
|
|
 |
cead2e |
-static int
|
|
 |
cead2e |
+static void
|
|
 |
cead2e |
netlink_close(nl_handle_t *nl)
|
|
 |
cead2e |
{
|
|
 |
cead2e |
+ if (!nl)
|
|
 |
cead2e |
+ return;
|
|
 |
cead2e |
+
|
|
 |
cead2e |
/* First of all release pending thread */
|
|
 |
cead2e |
thread_cancel(nl->thread);
|
|
 |
cead2e |
|
|
 |
cead2e |
@@ -269,8 +272,6 @@ netlink_close(nl_handle_t *nl)
|
|
 |
cead2e |
#endif
|
|
 |
cead2e |
close(nl->fd);
|
|
 |
cead2e |
#endif
|
|
 |
cead2e |
-
|
|
 |
cead2e |
- return 0;
|
|
 |
cead2e |
}
|
|
 |
cead2e |
|
|
 |
cead2e |
#ifdef _WITH_VRRP_
|
|
 |
cead2e |
--
|
|
 |
cead2e |
2.13.5
|
|
 |
cead2e |
|