summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0035-EventService-Fix-hostname-resolve-issue.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0035-EventService-Fix-hostname-resolve-issue.patch')
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0035-EventService-Fix-hostname-resolve-issue.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0035-EventService-Fix-hostname-resolve-issue.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0035-EventService-Fix-hostname-resolve-issue.patch
new file mode 100644
index 000000000..372ff6801
--- /dev/null
+++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0035-EventService-Fix-hostname-resolve-issue.patch
@@ -0,0 +1,137 @@
+From c3a63a9ff4103b215d85845b98ba51c039511713 Mon Sep 17 00:00:00 2001
+From: AppaRao Puli <apparao.puli@linux.intel.com>
+Date: Fri, 16 Oct 2020 17:03:36 +0530
+Subject: [PATCH] EventService - Fix hostname resolve issue
+
+The hostname also accepted in EventService
+as destination. When this hostname resolution
+fails, causes the bmcweb crash. So avoid the
+bmcweb crash by catching exception and control
+goes to retry process like any other failure.
+
+Tested:
+ - No bmcweb crash observed when hostname resolve fails.
+ - Created subscription with invalid hostname and
+ verified the retry process.
+ - Created subscriptions with positive cases and all
+ works fine.
+
+Change-Id: I0adf6864911c4cf49a11110519c73556d87f3279
+Signed-off-by: AppaRao Puli <apparao.puli@linux.intel.com>
+---
+ http/http_client.hpp | 54 ++++++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 42 insertions(+), 12 deletions(-)
+
+diff --git a/http/http_client.hpp b/http/http_client.hpp
+index 6d3d702..abccc84 100644
+--- a/http/http_client.hpp
++++ b/http/http_client.hpp
+@@ -36,6 +36,9 @@ static constexpr unsigned int httpReadBodyLimit = 1024;
+ enum class ConnState
+ {
+ initialized,
++ resolveInProgress,
++ resolveFailed,
++ resolved,
+ connectInProgress,
+ connectFailed,
+ sslHandshakeInProgress,
+@@ -52,6 +55,7 @@ enum class ConnState
+ class HttpClient : public std::enable_shared_from_this<HttpClient>
+ {
+ private:
++ boost::asio::ip::tcp::resolver resolver;
+ boost::asio::ssl::context ctx{boost::asio::ssl::context::tlsv12_client};
+ boost::beast::tcp_stream conn;
+ std::optional<boost::beast::ssl_stream<boost::beast::tcp_stream&>> sslConn;
+@@ -76,6 +80,32 @@ class HttpClient : public std::enable_shared_from_this<HttpClient>
+ bool runningTimer;
+ ConnState state;
+
++ void doResolve()
++ {
++ BMCWEB_LOG_DEBUG << "Trying to resolve: " << host << ":" << port;
++ if (state == ConnState::resolveInProgress)
++ {
++ return;
++ }
++ state = ConnState::resolveInProgress;
++ // TODO: Use async_resolver. boost asio example
++ // code as is crashing with async_resolve().
++ try
++ {
++ endpoint = resolver.resolve(host, port);
++ }
++ catch (const std::exception& e)
++ {
++ BMCWEB_LOG_ERROR << "Failed to resolve hostname: " << host << " - "
++ << e.what();
++ state = ConnState::resolveFailed;
++ checkQueue();
++ return;
++ }
++ state = ConnState::resolved;
++ checkQueue();
++ }
++
+ void doConnect()
+ {
+ if (useSsl)
+@@ -348,6 +378,7 @@ class HttpClient : public std::enable_shared_from_this<HttpClient>
+ }
+
+ if ((state == ConnState::connectFailed) ||
++ (state == ConnState::resolveFailed) ||
+ (state == ConnState::sendFailed) ||
+ (state == ConnState::recvFailed))
+ {
+@@ -393,16 +424,21 @@ class HttpClient : public std::enable_shared_from_this<HttpClient>
+ {
+ switch (state)
+ {
++ case ConnState::initialized:
++ case ConnState::resolveFailed:
++ case ConnState::connectFailed:
++ doResolve();
++ break;
+ case ConnState::connectInProgress:
++ case ConnState::resolveInProgress:
+ case ConnState::sslHandshakeInProgress:
+ case ConnState::sendInProgress:
+ case ConnState::suspended:
+ case ConnState::terminated:
+ // do nothing
+ break;
+- case ConnState::initialized:
+ case ConnState::closed:
+- case ConnState::connectFailed:
++ case ConnState::resolved:
+ case ConnState::sendFailed:
+ case ConnState::recvFailed:
+ {
+@@ -428,18 +464,12 @@ class HttpClient : public std::enable_shared_from_this<HttpClient>
+ const std::string& destIP, const std::string& destPort,
+ const std::string& destUri,
+ const bool inUseSsl = true) :
+- conn(ioc),
+- timer(ioc), subId(id), host(destIP), port(destPort), uri(destUri),
+- useSsl(inUseSsl), retryCount(0), maxRetryAttempts(5),
++ resolver(ioc),
++ conn(ioc), timer(ioc), subId(id), host(destIP), port(destPort),
++ uri(destUri), useSsl(inUseSsl), retryCount(0), maxRetryAttempts(5),
+ retryPolicyAction("TerminateAfterRetries"), runningTimer(false),
+ state(ConnState::initialized)
+- {
+- boost::asio::ip::tcp::resolver resolver(ioc);
+- // TODO: Use async_resolver. boost asio example
+- // code as is crashing with async_resolve().
+- // It needs debug.
+- endpoint = resolver.resolve(host, port);
+- }
++ {}
+
+ void sendData(const std::string& data)
+ {
+--
+2.7.4
+