Fix parsing of Redfish messages with empty MessageArgs
The current parsing shows an empty string as a MessageArg for
messages that have no arguments. This fixes it to correctly
display an empty MessageArgs.
It also fixes a parsing range check error for the case when
a message without MessageArgs is not terminated with a comma.
Tested:
Verified that messages show without args show in Redfish with
an empty MessageArgs.
Injected a message without a terminating comma and confirmed that
it is correctly parsed and displayed.
Change-Id: I896554941d2d239afa889d41edef1f1f71b59906
Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com>
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index f65f3cc..9e3b2f0 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -584,8 +584,6 @@
return 1;
}
std::string &messageID = logEntryFields[0];
- std::string &messageArgsStart = logEntryFields[1];
- std::size_t messageArgsSize = logEntryFields.size() - 1;
// Get the Message from the MessageRegistry
const message_registries::Message *message =
@@ -599,18 +597,30 @@
severity = message->severity;
}
- // Get the MessageArgs from the log
- boost::beast::span messageArgs(&messageArgsStart, messageArgsSize);
-
- // Fill the MessageArgs into the Message
- int i = 0;
- for (const std::string &messageArg : messageArgs)
+ // Get the MessageArgs from the log if there are any
+ boost::beast::span<std::string> messageArgs;
+ if (logEntryFields.size() > 1)
{
- std::string argStr = "%" + std::to_string(++i);
- size_t argPos = msg.find(argStr);
- if (argPos != std::string::npos)
+ std::string &messageArgsStart = logEntryFields[1];
+ // If the first string is empty, assume there are no MessageArgs
+ std::size_t messageArgsSize = 0;
+ if (!messageArgsStart.empty())
{
- msg.replace(argPos, argStr.length(), messageArg);
+ messageArgsSize = logEntryFields.size() - 1;
+ }
+
+ messageArgs = boost::beast::span(&messageArgsStart, messageArgsSize);
+
+ // Fill the MessageArgs into the Message
+ int i = 0;
+ for (const std::string &messageArg : messageArgs)
+ {
+ std::string argStr = "%" + std::to_string(++i);
+ size_t argPos = msg.find(argStr);
+ if (argPos != std::string::npos)
+ {
+ msg.replace(argPos, argStr.length(), messageArg);
+ }
}
}