diff options
author | Nagaraju Goruganti <ngorugan@in.ibm.com> | 2018-03-21 11:18:30 -0500 |
---|---|---|
committer | Tom Joseph <tomjoseph@in.ibm.com> | 2018-03-27 08:33:29 +0000 |
commit | 7f2d7c90a27aacb45fa5ccc18c777593e007d2a7 (patch) | |
tree | 15076e9d22b4ccfef92e97663f6359228d5a71e4 /storagehandler.cpp | |
parent | 8466b792959984e6b02eadb1cdf02d1868373401 (diff) | |
download | phosphor-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.cpp | 29 |
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) { |