Fix a possible null pointer dereference
- This commit would fix a potential null pointer dereference.
Signed-off-by: Manojkiran Eda <manojkiran.eda@gmail.com>
Change-Id: Ic323bde2c4bd35c35132e4310466cd6ae7ec7aeb
Signed-off-by: George Liu <liuxiwei@inspur.com>
diff --git a/libpldm/fru.c b/libpldm/fru.c
index 207d4de..3e0887d 100644
--- a/libpldm/fru.c
+++ b/libpldm/fru.c
@@ -177,13 +177,12 @@
size_t record_hdr_size = sizeof(struct pldm_fru_record_data_format) -
sizeof(struct pldm_fru_record_tlv);
- if ((*curr_size + record_hdr_size + tlvs_size) != total_size) {
- return PLDM_ERROR_INVALID_LENGTH;
- }
-
if (fru_table == NULL || curr_size == NULL || !tlvs_size) {
return PLDM_ERROR_INVALID_DATA;
}
+ if ((*curr_size + record_hdr_size + tlvs_size) != total_size) {
+ return PLDM_ERROR_INVALID_LENGTH;
+ }
struct pldm_fru_record_data_format *record =
(struct pldm_fru_record_data_format *)(fru_table + *curr_size);
diff --git a/libpldmresponder/pdr_numeric_effecter.hpp b/libpldmresponder/pdr_numeric_effecter.hpp
index 9152320..ca6e5ad 100644
--- a/libpldmresponder/pdr_numeric_effecter.hpp
+++ b/libpldmresponder/pdr_numeric_effecter.hpp
@@ -38,6 +38,11 @@
pldm_numeric_effecter_value_pdr* pdr =
reinterpret_cast<pldm_numeric_effecter_value_pdr*>(entry.data());
+ if (!pdr)
+ {
+ std::cerr << "Failed to get numeric effecter PDR.\n";
+ continue;
+ }
pdr->hdr.record_handle = 0;
pdr->hdr.version = 1;
pdr->hdr.type = PLDM_NUMERIC_EFFECTER_PDR;
diff --git a/libpldmresponder/pdr_state_effecter.hpp b/libpldmresponder/pdr_state_effecter.hpp
index aa0e912..0ddfdfa 100644
--- a/libpldmresponder/pdr_state_effecter.hpp
+++ b/libpldmresponder/pdr_state_effecter.hpp
@@ -57,6 +57,11 @@
pldm_state_effecter_pdr* pdr =
reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
+ if (!pdr)
+ {
+ std::cerr << "Failed to get state effecter PDR.\n";
+ continue;
+ }
pdr->hdr.record_handle = 0;
pdr->hdr.version = 1;
pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
diff --git a/libpldmresponder/pdr_state_sensor.hpp b/libpldmresponder/pdr_state_sensor.hpp
index b94b297..5093dcf 100644
--- a/libpldmresponder/pdr_state_sensor.hpp
+++ b/libpldmresponder/pdr_state_sensor.hpp
@@ -56,6 +56,11 @@
pldm_state_sensor_pdr* pdr =
reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
+ if (!pdr)
+ {
+ std::cerr << "Failed to get state sensor PDR.\n";
+ continue;
+ }
pdr->hdr.record_handle = 0;
pdr->hdr.version = 1;
pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
index 43e0de4..d595c2e 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
@@ -161,6 +161,7 @@
{
std::cerr << "Failed to get record by PDR type, ERROR:"
<< PLDM_PLATFORM_INVALID_EFFECTER_ID << std::endl;
+ return;
}
pdr->hdr.record_handle = 0;
pdr->hdr.version = 1;
@@ -211,6 +212,7 @@
{
std::cerr << "Failed to get record by PDR type, ERROR:"
<< PLDM_PLATFORM_INVALID_SENSOR_ID << std::endl;
+ return;
}
pdr->hdr.record_handle = 0;
pdr->hdr.version = 1;
diff --git a/pldmtool/pldm_platform_cmd.cpp b/pldmtool/pldm_platform_cmd.cpp
index 77bcb5b..2c4a6df 100644
--- a/pldmtool/pldm_platform_cmd.cpp
+++ b/pldmtool/pldm_platform_cmd.cpp
@@ -291,6 +291,11 @@
data += sizeof(pldm_pdr_hdr);
pldm_pdr_fru_record_set* pdr =
reinterpret_cast<pldm_pdr_fru_record_set*>(data);
+ if (!pdr)
+ {
+ std::cerr << "Failed to get the FRU record set PDR" << std::endl;
+ return;
+ }
output["PLDMTerminusHandle"] = unsigned(pdr->terminus_handle);
output["FRURecordSetIdentifier"] = unsigned(pdr->fru_rsi);
@@ -314,6 +319,12 @@
data += sizeof(pldm_pdr_hdr);
pldm_pdr_entity_association* pdr =
reinterpret_cast<pldm_pdr_entity_association*>(data);
+ if (!pdr)
+ {
+ std::cerr << "Failed to get the PDR eneity association"
+ << std::endl;
+ return;
+ }
output["containerID"] = int(pdr->container_id);
output["associationType"] = assocationType.at(pdr->association_type);
@@ -346,6 +357,11 @@
{
struct pldm_numeric_effecter_value_pdr* pdr =
(struct pldm_numeric_effecter_value_pdr*)data;
+ if (!pdr)
+ {
+ std::cerr << "Failed to get numeric effecter PDR" << std::endl;
+ return;
+ }
output["PLDMTerminusHandle"] = int(pdr->terminus_handle);
output["effecterID"] = int(pdr->effecter_id);
@@ -536,6 +552,7 @@
{
if (data == NULL)
{
+ std::cerr << "Failed to get PDR message" << std::endl;
return;
}
@@ -544,6 +561,10 @@
output["responseCount"] = respCnt;
struct pldm_pdr_hdr* pdr = (struct pldm_pdr_hdr*)data;
+ if (!pdr)
+ {
+ return;
+ }
printCommonPDRHeader(pdr, output);
switch (pdr->type)
diff --git a/softoff/softoff.cpp b/softoff/softoff.cpp
index d215c1d..a704885 100644
--- a/softoff/softoff.cpp
+++ b/softoff/softoff.cpp
@@ -258,6 +258,12 @@
pdr = reinterpret_cast<pldm_state_sensor_pdr*>(rep.data());
}
+ if (!pdr)
+ {
+ std::cerr << "Failed to get state sensor PDR.\n";
+ return PLDM_ERROR;
+ }
+
sensorID = pdr->sensor_id;
auto compositeSensorCount = pdr->composite_sensor_count;