commit:     bb99b23e3f30a44d4880944ff42731297a0c5e3e
Author:     Tomas Mozes <hydrapolic <AT> gmail <DOT> com>
AuthorDate: Thu Nov 15 09:58:16 2018 +0000
Commit:     Mikle Kolyada <zlogene <AT> gentoo <DOT> org>
CommitDate: Thu Nov 15 13:49:01 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=bb99b23e

sys-cluster/keepalived: fix crash during shutdown

Bug: https://bugs.gentoo.org/670856
Bug: https://github.com/acassen/keepalived/issues/1061
Package-Manager: Portage-2.3.51, Repoman-2.3.12
Signed-off-by: Tomáš Mózes <hydrapolic <AT> gmail.com>
Closes: https://github.com/gentoo/gentoo/pull/10422
Signed-off-by: Mikle Kolyada <zlogene <AT> gentoo.org>

 .../files/keepalived-2.0.10-snmp-crash-fix.patch   | 122 +++++++++++++++++++++
 sys-cluster/keepalived/keepalived-2.0.10-r1.ebuild |  76 +++++++++++++
 2 files changed, 198 insertions(+)

diff --git 
a/sys-cluster/keepalived/files/keepalived-2.0.10-snmp-crash-fix.patch 
b/sys-cluster/keepalived/files/keepalived-2.0.10-snmp-crash-fix.patch
new file mode 100644
index 00000000000..c1a5ab36180
--- /dev/null
+++ b/sys-cluster/keepalived/files/keepalived-2.0.10-snmp-crash-fix.patch
@@ -0,0 +1,122 @@
+diff --git a/keepalived/check/check_snmp.c b/keepalived/check/check_snmp.c
+index 67ae0e4f9..95c6e6f83 100644
+--- a/keepalived/check/check_snmp.c
++++ b/keepalived/check/check_snmp.c
+@@ -1451,6 +1451,9 @@ static struct variable8 check_vars[] = {
+ void
+ check_snmp_agent_init(const char *snmp_socket)
+ {
++      if (snmp_running)
++              return;
++
+       /* We handle the global oid if we are running SNMP */
+       snmp_agent_init(snmp_socket, true);
+       snmp_register_mib(check_oid, OID_LENGTH(check_oid), "Healthchecker",
+@@ -1462,6 +1465,9 @@ check_snmp_agent_init(const char *snmp_socket)
+ void
+ check_snmp_agent_close()
+ {
++      if (!snmp_running)
++              return;
++
+       snmp_unregister_mib(check_oid, OID_LENGTH(check_oid));
+       snmp_agent_close(true);
+ }
+diff --git a/keepalived/core/snmp.c b/keepalived/core/snmp.c
+index a9472feae..eb5bed20a 100644
+--- a/keepalived/core/snmp.c
++++ b/keepalived/core/snmp.c
+@@ -325,6 +325,9 @@ snmp_unregister_mib(oid *myoid, size_t len)
+ void
+ snmp_agent_init(const char *snmp_socket, bool base_mib)
+ {
++      if (snmp_running)
++              return;
++
+       log_message(LOG_INFO, "Starting SNMP subagent");
+       netsnmp_enable_subagent();
+       snmp_disable_log();
+@@ -378,6 +381,9 @@ snmp_agent_init(const char *snmp_socket, bool base_mib)
+ void
+ snmp_agent_close(bool base_mib)
+ {
++      if (!snmp_running)
++              return;
++
+       if (base_mib)
+               snmp_unregister_mib(global_oid, OID_LENGTH(global_oid));
+       snmp_shutdown(global_name);
+diff --git a/keepalived/vrrp/vrrp_snmp.c b/keepalived/vrrp/vrrp_snmp.c
+index ca9d46768..db696159c 100644
+--- a/keepalived/vrrp/vrrp_snmp.c
++++ b/keepalived/vrrp/vrrp_snmp.c
+@@ -4552,6 +4552,9 @@ vrrp_handles_global_oid(void)
+ void
+ vrrp_snmp_agent_init(const char *snmp_socket)
+ {
++      if (snmp_running)
++              return;
++
+       /* We let the check process handle the global OID if it is running and 
with snmp */
+       snmp_agent_init(snmp_socket, vrrp_handles_global_oid());
+ 
+@@ -4581,6 +4584,9 @@ vrrp_snmp_agent_init(const char *snmp_socket)
+ void
+ vrrp_snmp_agent_close(void)
+ {
++      if (!snmp_running)
++              return;
++
+ #ifdef _WITH_SNMP_VRRP_
+       if (global_data->enable_snmp_vrrp)
+               snmp_unregister_mib(vrrp_oid, OID_LENGTH(vrrp_oid));
+diff --git a/lib/scheduler.c b/lib/scheduler.c
+index 0a1c334c3..9090a7f88 100644
+--- a/lib/scheduler.c
++++ b/lib/scheduler.c
+@@ -1630,7 +1630,7 @@ thread_fetch_next_queue(thread_master_t *m)
+                               if (!ev->read) {
+                                       log_message(LOG_INFO, "scheduler: No 
read thread bound on fd:%d (fl:0x%.4X)"
+                                                     , ev->fd, ep_ev->events);
+-                                      assert(0);
++                                      continue;
+                               }
+                               thread_move_ready(m, &m->read, ev->read, 
THREAD_READY_FD);
+                               ev->read = NULL;
+@@ -1641,7 +1641,7 @@ thread_fetch_next_queue(thread_master_t *m)
+                               if (!ev->write) {
+                                       log_message(LOG_INFO, "scheduler: No 
write thread bound on fd:%d (fl:0x%.4X)"
+                                                     , ev->fd, ep_ev->events);
+-                                      assert(0);
++                                      continue;
+                               }
+                               thread_move_ready(m, &m->write, ev->write, 
THREAD_READY_FD);
+                               ev->write = NULL;
+@@ -1710,7 +1710,12 @@ process_threads(thread_master_t *m)
+               thread = thread_trim_head(thread_list);
+               if (!shutting_down ||
+                   (thread->type == THREAD_READY_FD &&
+-                   (thread->u.fd == m->timer_fd || thread->u.fd == 
m->signal_fd)) ||
++                   (thread->u.fd == m->timer_fd ||
++                    thread->u.fd == m->signal_fd
++#ifdef _WITH_SNMP_
++                    || FD_ISSET(thread->u.fd, &m->snmp_fdset)
++#endif
++                                                             )) ||
+                   thread->type == THREAD_CHILD ||
+                   thread->type == THREAD_CHILD_TIMEOUT ||
+                   thread->type == THREAD_CHILD_TERMINATED ||
+diff --git a/lib/utils.c b/lib/utils.c
+index 6f9ec254d..e5b82b524 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -789,7 +789,9 @@ FILE *fopen_safe(const char *path, const char *mode)
+ {
+       int fd;
+       FILE *file;
++#ifdef ENABLE_LOG_FILE_APPEND
+       int flags = O_NOFOLLOW | O_CREAT | O_CLOEXEC;
++#endif
+       int sav_errno;
+       char file_tmp_name[] = "/tmp/keepalivedXXXXXX";
+ 

diff --git a/sys-cluster/keepalived/keepalived-2.0.10-r1.ebuild 
b/sys-cluster/keepalived/keepalived-2.0.10-r1.ebuild
new file mode 100644
index 00000000000..5eea98a00f6
--- /dev/null
+++ b/sys-cluster/keepalived/keepalived-2.0.10-r1.ebuild
@@ -0,0 +1,76 @@
+# Copyright 1999-2018 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit autotools systemd
+
+DESCRIPTION="A strong & robust keepalive facility to the Linux Virtual Server 
project"
+HOMEPAGE="http://www.keepalived.org/";
+SRC_URI="http://www.keepalived.org/software/${P}.tar.gz";
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc ~ppc64 ~s390 ~sparc ~x86"
+IUSE="dbus debug ipv6 -json snmp"
+
+RDEPEND="dev-libs/libnl:=
+       dev-libs/openssl:=
+       dev-libs/popt
+       net-libs/libnfnetlink
+       sys-apps/iproute2
+       dbus? ( sys-apps/dbus )
+       json? ( dev-libs/json-c:= )
+       snmp? ( net-analyzer/net-snmp )"
+DEPEND="${RDEPEND}
+       >=sys-kernel/linux-headers-4.4"
+
+DOCS=(
+       README CONTRIBUTORS INSTALL ChangeLog AUTHOR TODO
+       doc/keepalived.conf.SYNOPSIS doc/NOTE_vrrp_vmac.txt
+)
+
+PATCHES=(
+       "${FILESDIR}/${P}-snmp-crash-fix.patch"
+)
+
+src_prepare() {
+       default
+
+       eautoreconf
+}
+
+src_configure() {
+       STRIP=/bin/true \
+       econf \
+               --with-kernel-dir=/usr \
+               --enable-sha1 \
+               --enable-vrrp \
+               $(use_enable dbus) \
+               $(use_enable dbus dbus-create-instance) \
+               $(use_enable debug) \
+               $(use_enable json) \
+               $(use_enable snmp)
+}
+
+src_install() {
+       default
+
+       newinitd "${FILESDIR}"/keepalived.init-r1 keepalived
+       newconfd "${FILESDIR}"/keepalived.confd-r1 keepalived
+
+       systemd_newunit "${FILESDIR}"/${PN}.service ${PN}.service
+       systemd_install_serviced "${FILESDIR}/${PN}.service.conf"
+
+       use snmp && dodoc doc/KEEPALIVED-MIB.txt
+
+       docinto genhash
+       dodoc genhash/README genhash/AUTHOR genhash/ChangeLog
+       # This was badly named by upstream, it's more HOWTO than anything else.
+       newdoc INSTALL INSTALL+HOWTO
+
+       # Security risk to bundle SSL certs
+       rm -v "${ED}"/etc/keepalived/samples/*.pem || die
+       # Clean up sysvinit files
+       rm -rv "${ED}"/etc/sysconfig || die
+}

Reply via email to