summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMatt Spinler <spinler@us.ibm.com>2019-01-30 21:57:18 +0300
committerMatt Spinler <spinler@us.ibm.com>2019-01-30 21:57:18 +0300
commitf39420c7f19bc6939ca87ce262f5720a2e50940b (patch)
treea470b93436ff90597a9db332fdf9406e5a85812b /include
parentda21df7cde6abd82e2839cde8ab9eb96ea571492 (diff)
downloadbmcweb-f39420c7f19bc6939ca87ce262f5720a2e50940b.tar.xz
REST: sd_bus_message->JSON: fix multiple entries
When convertDBusToJSON processed an sd_bus_message with a signature that had multiple high level entries, the handler code tried to reassign a reference variable to a new array entry, but references can't be reassigned, so all it did was reset the passed in JSON object to the empty value at the end of the array. Instead, do this with a pointer. Tested: A message with a signature of "sa{sv}as" was failing, with nlohmann::json complaining about trying to do a push_back on a string object. With this fix, that no longer happens. Change-Id: Idb3d3a56f0bd38f559f96f828ad95db65bbd11e1 Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Diffstat (limited to 'include')
-rw-r--r--include/openbmc_dbus_rest.hpp40
1 files changed, 20 insertions, 20 deletions
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 5a00572cdd..907febb118 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -1037,18 +1037,18 @@ int convertDBusToJSON(const std::string &returnType,
int r = 0;
const std::vector<std::string> returnTypes = dbusArgSplit(returnType);
- nlohmann::json &thisElement = response;
for (const std::string &typeCode : returnTypes)
{
- if (returnType.size() > 1)
+ nlohmann::json *thisElement = &response;
+ if (returnTypes.size() > 1)
{
response.push_back(nlohmann::json{});
- thisElement = response.back();
+ thisElement = &response.back();
}
if (typeCode == "s")
{
- r = readMessageItem<char *>(typeCode, m, thisElement);
+ r = readMessageItem<char *>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1056,7 +1056,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "g")
{
- r = readMessageItem<char *>(typeCode, m, thisElement);
+ r = readMessageItem<char *>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1064,7 +1064,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "o")
{
- r = readMessageItem<char *>(typeCode, m, thisElement);
+ r = readMessageItem<char *>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1072,17 +1072,17 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "b")
{
- r = readMessageItem<int>(typeCode, m, thisElement);
+ r = readMessageItem<int>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
}
- thisElement = static_cast<bool>(thisElement.get<int>());
+ *thisElement = static_cast<bool>(thisElement->get<int>());
}
else if (typeCode == "u")
{
- r = readMessageItem<uint32_t>(typeCode, m, thisElement);
+ r = readMessageItem<uint32_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1090,7 +1090,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "i")
{
- r = readMessageItem<int32_t>(typeCode, m, thisElement);
+ r = readMessageItem<int32_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1098,7 +1098,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "x")
{
- r = readMessageItem<int64_t>(typeCode, m, thisElement);
+ r = readMessageItem<int64_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1106,7 +1106,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "t")
{
- r = readMessageItem<uint64_t>(typeCode, m, thisElement);
+ r = readMessageItem<uint64_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1114,7 +1114,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "n")
{
- r = readMessageItem<int16_t>(typeCode, m, thisElement);
+ r = readMessageItem<int16_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1122,7 +1122,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "q")
{
- r = readMessageItem<uint16_t>(typeCode, m, thisElement);
+ r = readMessageItem<uint16_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1130,7 +1130,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "y")
{
- r = readMessageItem<uint8_t>(typeCode, m, thisElement);
+ r = readMessageItem<uint8_t>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1138,7 +1138,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "d")
{
- r = readMessageItem<double>(typeCode, m, thisElement);
+ r = readMessageItem<double>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1146,7 +1146,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (typeCode == "h")
{
- r = readMessageItem<int>(typeCode, m, thisElement);
+ r = readMessageItem<int>(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1154,7 +1154,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (boost::starts_with(typeCode, "a"))
{
- r = readArrayFromMessage(typeCode, m, thisElement);
+ r = readArrayFromMessage(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1163,7 +1163,7 @@ int convertDBusToJSON(const std::string &returnType,
else if (boost::starts_with(typeCode, "(") &&
boost::ends_with(typeCode, ")"))
{
- r = readStructFromMessage(typeCode, m, thisElement);
+ r = readStructFromMessage(typeCode, m, *thisElement);
if (r < 0)
{
return r;
@@ -1171,7 +1171,7 @@ int convertDBusToJSON(const std::string &returnType,
}
else if (boost::starts_with(typeCode, "v"))
{
- r = readVariantFromMessage(m, thisElement);
+ r = readVariantFromMessage(m, *thisElement);
if (r < 0)
{
return r;