From 300464ea1569fa0b02177ac6c944fd53e1e95a94 Mon Sep 17 00:00:00 2001 From: jxy_git Date: Thu, 25 Aug 2022 17:03:41 +0800 Subject: [PATCH] Fix fence_virtd.service stop failed (cherry picked from commit a58c2a2152a6418b6820a4e2805afc95806b53f9) --- Fix-fence_virtd.service-stop-failed.patch | 24 ++++++ ...ence_virtd-1-fix-segfault-no-domains.patch | 29 +++++++ ...virtd-2-return-mainloop-on-interrupt.patch | 81 +++++++++++++++++++ fence-virt.spec | 13 ++- 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 Fix-fence_virtd.service-stop-failed.patch create mode 100644 bz1766993-fence_virtd-1-fix-segfault-no-domains.patch create mode 100644 bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch diff --git a/Fix-fence_virtd.service-stop-failed.patch b/Fix-fence_virtd.service-stop-failed.patch new file mode 100644 index 0000000..efc682b --- /dev/null +++ b/Fix-fence_virtd.service-stop-failed.patch @@ -0,0 +1,24 @@ +From 06a6cd75ae1b99b956e8135b7478dd9e0f7bbdb9 Mon Sep 17 00:00:00 2001 +From: jxy_git +Date: Wed, 24 Aug 2022 17:29:21 +0800 +Subject: [PATCH] Fix fence_virtd.service stop failed + +--- + fence_virtd.service.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fence_virtd.service.in b/fence_virtd.service.in +index 14c2b3a..766c986 100644 +--- a/fence_virtd.service.in ++++ b/fence_virtd.service.in +@@ -10,6 +10,7 @@ After=corosync.service + + Requires=basic.target + Requires=network.target ++Requires=libvirtd.service + + [Install] + WantedBy=multi-user.target +-- +2.33.0 + diff --git a/bz1766993-fence_virtd-1-fix-segfault-no-domains.patch b/bz1766993-fence_virtd-1-fix-segfault-no-domains.patch new file mode 100644 index 0000000..a746ba4 --- /dev/null +++ b/bz1766993-fence_virtd-1-fix-segfault-no-domains.patch @@ -0,0 +1,29 @@ +From 36367a99eb803a7941f6cbfd6086e7a71bf91e21 Mon Sep 17 00:00:00 2001 +From: Andrew Price +Date: Tue, 29 Oct 2019 11:27:06 +0000 +Subject: [PATCH] fence_virtd: Fix segfault in vl_get when no domains are found + +If virConnectListAllDomains() returns 0 on every iteration, the loop +will end with a vl == NULL and the pointer dereference in the qsort() +call will result in a segfault. Check for NULL on completion of the loop +to guard against that. + +Signed-off-by: Andrew Price +--- + server/virt.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/server/virt.c b/server/virt.c +index 9710791..ed08e0c 100644 +--- a/server/virt.c ++++ b/server/virt.c +@@ -128,6 +128,9 @@ virt_list_t *vl_get(virConnectPtr *vp, int vp_count, int my_id) + + _free_dom_list(dom_list, ret); + } ++ /* No domains found */ ++ if (!vl) ++ return NULL; + + /* We have all the locally running domains & states now */ + /* Sort */ diff --git a/bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch b/bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch new file mode 100644 index 0000000..152d8f3 --- /dev/null +++ b/bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch @@ -0,0 +1,81 @@ +From 958c0035aa6a69149c1a0fa218863c26e755d9e6 Mon Sep 17 00:00:00 2001 +From: Ryan McCabe +Date: Fri, 19 Jan 2018 11:04:22 -0500 +Subject: [PATCH] fence_virtd: Return control to main loop on select + interruption + +Return control to the dispatch loop if select is interrupted by a +signal. The code that retried the select without breaking out of the +dispatch loop caused the daemon to not be able to be killed cleanly. + +Resolves: https://github.com/ClusterLabs/fence-virt/issues/10 + +Signed-off-by: Ryan McCabe +--- + server/mcast.c | 9 +++++++-- + server/serial.c | 9 ++++++--- + server/tcp.c | 9 +++++++-- + 4 files changed, 28 insertions(+), 9 deletions(-) + +diff --git a/server/mcast.c b/server/mcast.c +index 0336823..e103675 100644 +--- a/server/mcast.c ++++ b/server/mcast.c +@@ -350,9 +350,14 @@ mcast_dispatch(listener_context_t c, struct timeval *timeout) + FD_ZERO(&rfds); + FD_SET(info->mc_sock, &rfds); + +- n = _select_retry((info->mc_sock)+1, &rfds, NULL, NULL, timeout); +- if (n <= 0) ++ n = select((info->mc_sock)+1, &rfds, NULL, NULL, timeout); ++ if (n <= 0) { ++ if (errno == EINTR || errno == EAGAIN) ++ n = 0; ++ else ++ dbg_printf(2, "select: %s\n", strerror(errno)); + return n; ++ } + + slen = sizeof(sin); + len = recvfrom(info->mc_sock, &data, sizeof(data), 0, +diff --git a/server/serial.c b/server/serial.c +index 70eb22b..23d143d 100644 +--- a/server/serial.c ++++ b/server/serial.c +@@ -272,9 +272,12 @@ serial_dispatch(listener_context_t c, struct timeval *timeout) + if (info->wake_fd > max) + max = info->wake_fd; + +- n = _select_retry(max+1, &rfds, NULL, NULL, timeout); +- if (n < 0) { +- dbg_printf(2, "select: %s\n", strerror(errno)); ++ n = select(max+1, &rfds, NULL, NULL, timeout); ++ if (n <= 0) { ++ if (errno == EINTR || errno == EAGAIN) ++ n = 0; ++ else ++ dbg_printf(2, "select: %s\n", strerror(errno)); + return n; + } + +diff --git a/server/tcp.c b/server/tcp.c +index 09366b7..bbd347e 100644 +--- a/server/tcp.c ++++ b/server/tcp.c +@@ -278,9 +278,14 @@ tcp_dispatch(listener_context_t c, struct timeval *timeout) + FD_ZERO(&rfds); + FD_SET(info->listen_sock, &rfds); + +- n = _select_retry(info->listen_sock + 1, &rfds, NULL, NULL, timeout); +- if (n <= 0) ++ n = select(info->listen_sock + 1, &rfds, NULL, NULL, timeout); ++ if (n <= 0) { ++ if (errno == EINTR || errno == EAGAIN) ++ n = 0; ++ else ++ dbg_printf(2, "select: %s\n", strerror(errno)); + return n; ++ } + + client_fd = accept(info->listen_sock, NULL, NULL); + if (client_fd < 0) { diff --git a/fence-virt.spec b/fence-virt.spec index 5b94405..ef8b17e 100644 --- a/fence-virt.spec +++ b/fence-virt.spec @@ -1,6 +1,6 @@ Name: fence-virt Version: 0.4.0 -Release: 9 +Release: 10 Summary: A pluggable fencing framework for virtual machines Group: System Environment/Base License: GPLv2+ @@ -12,6 +12,9 @@ Source0: https://github.com/ClusterLabs/fence-virt/archive/v%{version}.tar.gz Patch0: bz1624110-1-harden-fPIE.patch Patch1: bz1624110-2-fence_virt-fix-coredump.patch Patch2: bz1668357-fence_virt-dont-report-success-incorrect-parameter.patch +Patch3: bz1766993-fence_virtd-1-fix-segfault-no-domains.patch +Patch4: bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch +Patch5: Fix-fence_virtd.service-stop-failed.patch BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) @@ -99,6 +102,9 @@ are located on corosync cluster nodes. %patch0 -p1 %patch1 -p1 %patch2 -p1 -F1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build ./autogen.sh @@ -190,6 +196,11 @@ fi %{_libdir}/%{name}/cpg.so %changelog +* Thu Aug 25 2022 jiangxinyu - 0.4.0-10 +- Add bz1766993-fence_virtd-1-fix-segfault-no-domains.patch +- Add bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch +- Add Fix-fence_virtd.service-stop-failed.patch + * Mon Dec 12 2020 huanghaitao - 0.4.0-9 - Remove the release suffix -- Gitee