Blame SOURCES/bz1508435-no-segfault-ip_vs-load.patch

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