summaryrefslogtreecommitdiffstats
path: root/storagehandler.cpp
diff options
context:
space:
mode:
authorNagaraju Goruganti <ngorugan@in.ibm.com>2018-03-21 11:18:30 -0500
committerTom Joseph <tomjoseph@in.ibm.com>2018-03-27 08:33:29 +0000
commit7f2d7c90a27aacb45fa5ccc18c777593e007d2a7 (patch)
tree15076e9d22b4ccfef92e97663f6359228d5a71e4 /storagehandler.cpp
parent8466b792959984e6b02eadb1cdf02d1868373401 (diff)
downloadphosphor-host-ipmid-7f2d7c90a27aacb45fa5ccc18c777593e007d2a7.tar.gz
phosphor-host-ipmid-7f2d7c90a27aacb45fa5ccc18c777593e007d2a7.zip
Fixed broken "fru read" command
Fixed below given two issues: 1.We are getting seg-fault due to incorrect format specifiers for log-entry. 2.When requested data count plus offset exceeds fruArea size, we through error, instead we can return remaining bytes. Tested: 1.Verified using below given command. ipmitool -I lanplus -C 3 -P 0penBmc -H <BMP_IP> fru read <fru_id> fru_file Resolves openbmc/openbmc#2893 Change-Id: Iecfe80ed7230b936eca86fd16208582ee7b4e09c Signed-off-by: Nagaraju Goruganti <ngorugan@in.ibm.com>
Diffstat (limited to 'storagehandler.cpp')
-rw-r--r--storagehandler.cpp29
1 files changed, 14 insertions, 15 deletions
diff --git a/storagehandler.cpp b/storagehandler.cpp
index fa630e3..b222fa7 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -640,32 +640,31 @@ ipmi_ret_t ipmi_storage_read_fru_data(
{
ipmi_ret_t rc = IPMI_CC_OK;
const ReadFruDataRequest* reqptr =
- reinterpret_cast<const ReadFruDataRequest*>(request);
+ reinterpret_cast<const ReadFruDataRequest*>(request);
+ auto resptr =
+ reinterpret_cast<ReadFruDataResponse*>(response);
auto offset =
static_cast<uint16_t>(reqptr->offsetMS << 8 | reqptr->offsetLS);
try
{
const auto& fruArea = getFruAreaData(reqptr->fruID);
auto size = fruArea.size();
- if ((offset + reqptr->count) > size)
+
+ // Write the count of response data.
+ if ((offset + reqptr->count) <= size)
{
- log<level::ERR>("Invalid offset and count",
- entry("OFFSET=%s", offset),
- entry("COUNT=%s", reqptr->count),
- entry("SIZE_OF_FRU_AREA=%s", size));
- return IPMI_CC_INVALID;
+ resptr->count = reqptr->count;
+ }
+ else
+ {
+ resptr->count = size - offset;
}
-
- // Write the count of requested data.
- auto buff = static_cast<uint8_t *>(response);
- *buff = reqptr->count;
- buff++;
std::copy((fruArea.begin() + offset),
- (fruArea.begin() + offset + reqptr->count),
- buff);
+ (fruArea.begin() + offset + resptr->count),
+ resptr->data);
- *data_len = reqptr->count + 1; // additional one byte for count
+ *data_len = resptr->count + 1; // additional one byte for count
}
catch (const InternalFailure& e)
{
OpenPOWER on IntegriCloud