Fix potential map::at error
There are some potential errors, when using the map::at method,
the process may hang due to out of bounds. so the exception should
be caught.
Also, use the map::contains method of C++20 instead of map::find.
Tested: built pldm successfully and worked.
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: Ia5d7dea906e5c598072c08b27387195ef1201839
diff --git a/host-bmc/dbus_to_event_handler.cpp b/host-bmc/dbus_to_event_handler.cpp
index 7b2d207..ac8778f 100644
--- a/host-bmc/dbus_to_event_handler.cpp
+++ b/host-bmc/dbus_to_event_handler.cpp
@@ -80,6 +80,12 @@
{
// Encode PLDM platform event msg to indicate a state sensor change.
// DSP0248_1.2.0 Table 19
+ if (!dbusMaps.contains(sensorId))
+ {
+ std::cerr << "Invalid sensor ID : " << sensorId << std::endl;
+ return;
+ }
+
size_t sensorEventSize = PLDM_SENSOR_EVENT_DATA_MIN_LENGTH + 1;
const auto& [dbusMappings, dbusValMaps] = dbusMaps.at(sensorId);
for (uint8_t offset = 0; offset < dbusMappings.size(); ++offset)
@@ -151,7 +157,11 @@
{
pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data);
SensorId sensorId = LE16TOH(pdr->sensor_id);
- sensorHandlers.at(pdrType)(sensorId, dbusMaps);
+ if (sensorHandlers.contains(pdrType))
+ {
+ sensorHandlers.at(pdrType)(sensorId, dbusMaps);
+ }
+
pdrRecord = sensorPDRs.getNextRecord(pdrRecord, pdrEntry);
}
}
diff --git a/libpldmresponder/platform_numeric_effecter.hpp b/libpldmresponder/platform_numeric_effecter.hpp
index 62228e0..8aeaaa1 100644
--- a/libpldmresponder/platform_numeric_effecter.hpp
+++ b/libpldmresponder/platform_numeric_effecter.hpp
@@ -251,21 +251,30 @@
return rc;
}
- const auto& [dbusMappings, dbusValMaps] =
- handler.getDbusObjMaps(effecterId);
- DBusMapping dbusMapping{
- dbusMappings[0].objectPath, dbusMappings[0].interface,
- dbusMappings[0].propertyName, dbusMappings[0].propertyType};
try
{
- dBusIntf.setDbusProperty(dbusMapping, dbusValue.value());
+ const auto& [dbusMappings, dbusValMaps] =
+ handler.getDbusObjMaps(effecterId);
+ DBusMapping dbusMapping{
+ dbusMappings[0].objectPath, dbusMappings[0].interface,
+ dbusMappings[0].propertyName, dbusMappings[0].propertyType};
+ try
+ {
+
+ dBusIntf.setDbusProperty(dbusMapping, dbusValue.value());
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Error setting property, ERROR=" << e.what()
+ << " PROPERTY=" << dbusMapping.propertyName
+ << " INTERFACE=" << dbusMapping.interface << " PATH="
+ << dbusMapping.objectPath << "\n";
+ return PLDM_ERROR;
+ }
}
- catch (const std::exception& e)
+ catch (const std::out_of_range& e)
{
- std::cerr << "Error setting property, ERROR=" << e.what()
- << " PROPERTY=" << dbusMapping.propertyName << " INTERFACE="
- << dbusMapping.interface << " PATH=" << dbusMapping.objectPath
- << "\n";
+ std::cerr << "Unknown effecter ID : " << effecterId << e.what() << '\n';
return PLDM_ERROR;
}
diff --git a/libpldmresponder/platform_state_effecter.hpp b/libpldmresponder/platform_state_effecter.hpp
index ba1c9bd..5875f13 100644
--- a/libpldmresponder/platform_state_effecter.hpp
+++ b/libpldmresponder/platform_state_effecter.hpp
@@ -143,8 +143,8 @@
}
catch (const std::out_of_range& e)
{
- std::cerr << "the effecterId does not exist. effecter id: "
- << effecterId << e.what() << '\n';
+ std::cerr << "Unknown effecter ID : " << effecterId << e.what() << '\n';
+ return PLDM_ERROR;
}
return rc;
diff --git a/pldmtool/pldm_bios_cmd.cpp b/pldmtool/pldm_bios_cmd.cpp
index 68fc2d8..45d8f6e 100644
--- a/pldmtool/pldm_bios_cmd.cpp
+++ b/pldmtool/pldm_bios_cmd.cpp
@@ -354,7 +354,14 @@
if (verbose)
{
output["AttributeHandle"] = attrHandle;
- output["AttributeType"] = attrTypeMap.at(attrType);
+ if (attrTypeMap.contains(attrType))
+ {
+ output["AttributeType"] = attrTypeMap.at(attrType);
+ }
+ else
+ {
+ std::cout << "Get AttributeType failed.\n";
+ }
}
switch (attrType)
{
@@ -533,7 +540,14 @@
attrdata["AttributeHandle"] = attrHandle;
attrdata["AttributeNameHandle"] =
displayStringHandle(attrNameHandle, stringTable);
- attrdata["AttributeType"] = attrTypeMap.at(attrType);
+ if (attrTypeMap.contains(attrType))
+ {
+ attrdata["AttributeType"] = attrTypeMap.at(attrType);
+ }
+ else
+ {
+ std::cout << "Get AttributeType failed.\n";
+ }
switch (attrType)
{
diff --git a/pldmtool/pldm_platform_cmd.cpp b/pldmtool/pldm_platform_cmd.cpp
index 2c4a6df..18f0ef0 100644
--- a/pldmtool/pldm_platform_cmd.cpp
+++ b/pldmtool/pldm_platform_cmd.cpp
@@ -327,7 +327,15 @@
}
output["containerID"] = int(pdr->container_id);
- output["associationType"] = assocationType.at(pdr->association_type);
+ if (assocationType.contains(pdr->association_type))
+ {
+ output["associationType"] =
+ assocationType.at(pdr->association_type);
+ }
+ else
+ {
+ std::cout << "Get associationType failed.\n";
+ }
output["containerEntityType"] =
getEntityName(pdr->container.entity_type);
output["containerEntityInstanceNumber"] =
@@ -834,15 +842,30 @@
for (size_t i = 0; i < compSensorCount; i++)
{
+ if (sensorOpState.contains(stateField[i].sensor_op_state))
+ {
+ output.emplace(("sensorOpState[" + std::to_string(i) + "]"),
+ sensorOpState.at(stateField[i].sensor_op_state));
+ }
- output.emplace(("sensorOpState[" + std::to_string(i) + "]"),
- sensorOpState.at(stateField[i].sensor_op_state));
- output.emplace(("presentState[" + std::to_string(i) + "]"),
- sensorPresState.at(stateField[i].present_state));
- output.emplace(("previousState[" + std::to_string(i) + "]"),
- sensorPresState.at(stateField[i].previous_state));
- output.emplace(("eventState[" + std::to_string(i) + "]"),
- sensorPresState.at(stateField[i].event_state));
+ if (sensorPresState.contains(stateField[i].present_state))
+ {
+ output.emplace(("presentState[" + std::to_string(i) + "]"),
+ sensorPresState.at(stateField[i].present_state));
+ }
+
+ if (sensorPresState.contains(stateField[i].previous_state))
+ {
+ output.emplace(
+ ("previousState[" + std::to_string(i) + "]"),
+ sensorPresState.at(stateField[i].previous_state));
+ }
+
+ if (sensorPresState.contains(stateField[i].event_state))
+ {
+ output.emplace(("eventState[" + std::to_string(i) + "]"),
+ sensorPresState.at(stateField[i].event_state));
+ }
}
pldmtool::helper::DisplayInJson(output);