diff --git a/kdump-avoid-endless-loop-on-EAI_AGAIN.patch b/kdump-avoid-endless-loop-on-EAI_AGAIN.patch new file mode 100644 index 0000000..c55c5ab --- /dev/null +++ b/kdump-avoid-endless-loop-on-EAI_AGAIN.patch @@ -0,0 +1,102 @@ +From: Petr Pavlu +Date: Thu Mar 25 12:48:54 2021 +0100 +Subject: Avoid an endless loop when resolving a hostname fails with EAI_AGAIN +References: bsc#1183070 +Upstream: merged +Git-commit: 716883423f45acf3271c200353dce074d6ffc5be + +Method Routable::resolve() invokes function getaddrinfo() to obtain a +network address for a given hostname. This operation can fail with the +error code EAI_AGAIN to indicate that the name server encountered a +temporary failure. Routable::resolve() reacts to this situation by +calling getaddrinfo() again which can result in an endless loop if the +function continues to return this error code. It is not guaranteed that +the underlying reason for EAI_AGAIN will go away in some bounded time. + +The patch removes the EAI_AGAIN loop in Routable::resolve() and updates +the retry code in Routable::check() to repeatedly attempt resolving a +hostname until it succeeds or a specified timeout for network operations +is reached. + +--- + kdumptool/routable.cc | 38 ++++++++++++++++++++++++++++++-------- + 1 file changed, 30 insertions(+), 8 deletions(-) + +--- a/kdumptool/routable.cc ++++ b/kdumptool/routable.cc +@@ -17,6 +17,7 @@ + * 02110-1301, USA. + */ + ++#include + #include + + #include +@@ -36,6 +37,8 @@ + #include "stringutil.h" + #include "debug.h" + ++using std::min; ++ + //{{{ NetLink ------------------------------------------------------------------ + + #define NETLINK_DEF_RECV_MAX 1024 +@@ -470,9 +473,7 @@ bool Routable::resolve(void) + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_RAW; +- do { +- res = getaddrinfo(raw_host.c_str(), NULL, &hints, &m_ai); +- } while (res == EAI_AGAIN); ++ res = getaddrinfo(raw_host.c_str(), NULL, &hints, &m_ai); + + if (res == 0) + return true; +@@ -480,7 +481,8 @@ bool Routable::resolve(void) + if (res == EAI_SYSTEM) + throw KSystemError("Name resolution failed", errno); + +- if (res != EAI_NONAME && res != EAI_FAIL && res != EAI_NODATA) ++ if (res != EAI_NONAME && res != EAI_FAIL && res != EAI_NODATA && ++ res != EAI_AGAIN) + throw KGaiError("Name resolution failed", res); + + return false; +@@ -489,13 +491,33 @@ bool Routable::resolve(void) + // ----------------------------------------------------------------------------- + bool Routable::check(int timeout) + { ++ // Resolve the target hostname. An attempt is made regularly until the ++ // hostname can be resolved or a specified timeout for network operations ++ // is reached. ++ struct timespec tstop; ++ clock_gettime(CLOCK_MONOTONIC, &tstop); ++ tstop.tv_sec += timeout; ++ ++ while (!resolve()) { ++ struct timespec tsnow; ++ clock_gettime(CLOCK_MONOTONIC, &tsnow); ++ int interval = (tstop.tv_sec - tsnow.tv_sec) * 1000; ++ interval += (tstop.tv_nsec - tsnow.tv_nsec) / 1000000L; ++ if (interval <= 0) ++ return false; ++ ++ // Sleep, at most for 1 second. ++ struct timespec wait_period; ++ interval = min(interval, 1000); ++ wait_period.tv_sec = interval / 1000; ++ wait_period.tv_nsec = (interval % 1000) * 1000 * 1000; ++ nanosleep(&wait_period, NULL); ++ } ++ ++ // Check there is an existing route. + NetLink nl(RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE); + nl.setTimeout(timeout); + +- while (!resolve()) +- if (nl.waitRouteChange() != 0) +- return false; +- + while (!hasRoute()) + if (nl.waitRouteChange() != 0) + return false; diff --git a/kdump-install-real-resolv.conf.patch b/kdump-install-real-resolv.conf.patch new file mode 100644 index 0000000..d4894fc --- /dev/null +++ b/kdump-install-real-resolv.conf.patch @@ -0,0 +1,36 @@ +From: Petr Pavlu +Date: Thu Mar 25 12:43:32 2021 +0100 +Subject: Install /etc/resolv.conf using its resolved path +References: bsc#1183070 +Upstream: merged +Git-commit: b8439e03d4479f3ffa4b42961a5da18f4b819122 + +Resolve /etc/resolv.conf first to install directly the target file if it +is a symlink. This simplifies the setup and avoids any problems when the +real resolv.conf could be in a location that gets hidden by a mount done +in the kdump environment, for instance, /etc/resolv.conf -> +/run/netconfig/resolv.conf with tmpfs getting mounted on /run. + +--- + init/module-setup.sh | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +--- a/init/module-setup.sh ++++ b/init/module-setup.sh +@@ -308,7 +308,15 @@ install() { + + inst_multiple makedumpfile makedumpfile-R.pl kdumptool \ + $KDUMP_REQUIRED_PROGRAMS +- inst_simple /etc/resolv.conf ++ ++ # Install /etc/resolv.conf to provide initial DNS configuration. The file ++ # is resolved first to install directly the target file if it is a symlink. ++ # The real resolv.conf could be in a location that gets hidden by a mount ++ # done in the kdump environment, for instance, /etc/resolv.conf -> ++ # /run/netconfig/resolv.conf with tmpfs getting mounted on /run. ++ local resolv=$(realpath /etc/resolv.conf) ++ inst_simple "$resolv" /etc/resolv.conf ++ + inst_simple /usr/share/zoneinfo/UTC + inst_simple /etc/localtime + } diff --git a/kdump.changes b/kdump.changes index 33669a5..86a7456 100644 --- a/kdump.changes +++ b/kdump.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Fri May 28 10:33:45 UTC 2021 - Petr Tesařík + +- Fix use of DNS in the panic environment (bsc#1183070): + * kdump-avoid-endless-loop-on-EAI_AGAIN.patch: Avoid an endless + loop when resolving a hostname fails with EAI_AGAIN. + * kdump-install-real-resolv.conf.patch: Install /etc/resolv.conf + using its resolved path. + ------------------------------------------------------------------- Fri May 28 09:51:58 UTC 2021 - Petr Tesařík diff --git a/kdump.spec b/kdump.spec index b58cdd1..b695308 100644 --- a/kdump.spec +++ b/kdump.spec @@ -39,6 +39,8 @@ Patch11: %{name}-mounts.cc-Include-sys-ioctl.h.patch Patch12: %{name}-Add-bootdev-to-dracut-command-line.patch Patch13: %{name}-do-not-iterate-past-end-of-string.patch Patch14: %{name}-fix-incorrect-exit-code-checking.patch +Patch15: %{name}-avoid-endless-loop-on-EAI_AGAIN.patch +Patch16: %{name}-install-real-resolv.conf.patch BuildRequires: asciidoc BuildRequires: cmake BuildRequires: gcc-c++ @@ -97,6 +99,8 @@ after a crash dump has occured. %patch12 -p1 %patch13 -p1 %patch14 -p1 +%patch15 -p1 +%patch16 -p1 %build export CXXFLAGS="%{optflags} -std=c++11"