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);