fw_update: Fix parser error for libpldm API changes

The parser failed to parse PLDM packages due to the recent changes in
the libpldm API. This commit updates the package parser to handle that,
ensuring that PLDM packages can be parsed correctly.

Change-Id: I53979c33077f244e8f15ce56d318c745e2e1e076
Signed-off-by: Unive Tien <unive.tien.wiwynn@gmail.com>
diff --git a/fw-update/package_parser.cpp b/fw-update/package_parser.cpp
index 4f491ce..dc31f5e 100644
--- a/fw-update/package_parser.cpp
+++ b/fw-update/package_parser.cpp
@@ -224,7 +224,7 @@
 void PackageParserV1::parse(const std::vector<uint8_t>& pkgHdr,
                             uintmax_t pkgSize)
 {
-    if (pkgHeaderSize != pkgHdr.size())
+    if (pkgHeaderSize >= pkgHdr.size())
     {
         error("Invalid package header size '{PKG_HDR_SIZE}' ", "PKG_HDR_SIZE",
               pkgHeaderSize);
diff --git a/fw-update/test/device_updater_test.cpp b/fw-update/test/device_updater_test.cpp
index bd1d684..6190953 100644
--- a/fw-update/test/device_updater_test.cpp
+++ b/fw-update/test/device_updater_test.cpp
@@ -46,26 +46,13 @@
     EXPECT_EQ(packageSize, testPkgSize);
 
     package.seekg(0);
-    std::vector<uint8_t> packageHeader(sizeof(pldm_package_header_information));
-    package.read(new (packageHeader.data()) char,
-                 sizeof(pldm_package_header_information));
-
-    auto pkgHeaderInfo =
-        reinterpret_cast<const pldm_package_header_information*>(
-            packageHeader.data());
-    auto pkgHeaderInfoSize = sizeof(pldm_package_header_information) +
-                             pkgHeaderInfo->package_version_string_length;
-    packageHeader.clear();
-    packageHeader.resize(pkgHeaderInfoSize);
-    package.seekg(0);
-    package.read(new (packageHeader.data()) char, pkgHeaderInfoSize);
+    std::vector<uint8_t> packageHeader(testPkgSize);
+    package.read(new (packageHeader.data()) char, testPkgSize);
 
     auto parser = parsePkgHeader(packageHeader);
     EXPECT_NE(parser, nullptr);
 
     package.seekg(0);
-    packageHeader.resize(parser->pkgHeaderSize);
-    package.read(new (packageHeader.data()) char, parser->pkgHeaderSize);
 
     parser->parse(packageHeader, packageSize);
     const auto& fwDeviceIDRecords = parser->getFwDeviceIDRecords();
diff --git a/fw-update/test/package_parser_test.cpp b/fw-update/test/package_parser_test.cpp
index 4984ffd..6dba8be 100644
--- a/fw-update/test/package_parser_test.cpp
+++ b/fw-update/test/package_parser_test.cpp
@@ -7,6 +7,20 @@
 
 using namespace pldm::fw_update;
 
+void imageGenerate(std::vector<uint8_t>& image, size_t size)
+{
+    for (size_t i = 1; i <= size; ++i)
+    {
+        image.push_back(static_cast<uint8_t>(i));
+    }
+}
+
+void imageInsert(std::vector<uint8_t>& fwPkgHdr, std::vector<uint8_t>& image)
+{
+    // Insert the image at the end of the package header
+    fwPkgHdr.insert(fwPkgHdr.end(), image.begin(), image.end());
+}
+
 TEST(PackageParser, ValidPkgSingleDescriptorSingleComponent)
 {
     std::vector<uint8_t> fwPkgHdr{
@@ -24,11 +38,16 @@
         0x6E, 0x67, 0x33, 0x4F, 0x96, 0xAE, 0x56};
 
     constexpr uintmax_t pkgSize = 166;
+    constexpr uintmax_t pkgHeaderSize = 139;
+    constexpr uintmax_t pkgImageSize = pkgSize - pkgHeaderSize;
+    std::vector<uint8_t> compImage;
+    imageGenerate(compImage, pkgImageSize);
+    imageInsert(fwPkgHdr, compImage);
     constexpr std::string_view pkgVersion{"VersionString1"};
     auto parser = parsePkgHeader(fwPkgHdr);
     auto obj = parser.get();
     EXPECT_EQ(typeid(*obj).name(), typeid(PackageParserV1).name());
-    EXPECT_EQ(parser->pkgHeaderSize, fwPkgHdr.size());
+    EXPECT_EQ(parser->pkgHeaderSize, pkgHeaderSize);
     EXPECT_EQ(parser->pkgVersion, pkgVersion);
 
     parser->parse(fwPkgHdr, pkgSize);
@@ -84,11 +103,20 @@
         0x9C, 0x71};
 
     constexpr uintmax_t pkgSize = 407;
+    constexpr uintmax_t pkgHeaderSize = 326;
+    constexpr uintmax_t pkgImageSize = (pkgSize - pkgHeaderSize) / 3;
+    std::vector<uint8_t> compImage1, compImage2, compImage3;
+    imageGenerate(compImage1, pkgImageSize);
+    imageGenerate(compImage2, pkgImageSize);
+    imageGenerate(compImage3, pkgImageSize);
+    imageInsert(fwPkgHdr, compImage1);
+    imageInsert(fwPkgHdr, compImage2);
+    imageInsert(fwPkgHdr, compImage3);
     constexpr std::string_view pkgVersion{"VersionString1"};
     auto parser = parsePkgHeader(fwPkgHdr);
     auto obj = parser.get();
     EXPECT_EQ(typeid(*obj).name(), typeid(PackageParserV1).name());
-    EXPECT_EQ(parser->pkgHeaderSize, fwPkgHdr.size());
+    EXPECT_EQ(parser->pkgHeaderSize, pkgHeaderSize);
     EXPECT_EQ(parser->pkgVersion, pkgVersion);
 
     parser->parse(fwPkgHdr, pkgSize);
@@ -173,11 +201,10 @@
         0x6E, 0x67, 0x33, 0x4F, 0x96, 0xAE, 0x57};
 
     constexpr uintmax_t pkgSize = 166;
-    constexpr std::string_view pkgVersion{"VersionString1"};
-    auto parser = parsePkgHeader(fwPkgHdr);
-    auto obj = parser.get();
-    EXPECT_EQ(typeid(*obj).name(), typeid(PackageParserV1).name());
-    EXPECT_EQ(parser->pkgHeaderSize, fwPkgHdr.size());
-    EXPECT_EQ(parser->pkgVersion, pkgVersion);
-    EXPECT_THROW(parser->parse(fwPkgHdr, pkgSize), std::exception);
+    constexpr uintmax_t pkgHeaderSize = 139;
+    constexpr uintmax_t pkgImageSize = pkgSize - pkgHeaderSize;
+    std::vector<uint8_t> compImage;
+    imageGenerate(compImage, pkgImageSize);
+    imageInsert(fwPkgHdr, compImage);
+    EXPECT_EQ(parsePkgHeader(fwPkgHdr), nullptr);
 }
diff --git a/fw-update/update_manager.cpp b/fw-update/update_manager.cpp
index 66539d5..946efb3 100644
--- a/fw-update/update_manager.cpp
+++ b/fw-update/update_manager.cpp
@@ -76,20 +76,8 @@
     }
 
     package.seekg(0);
-    std::vector<uint8_t> packageHeader(sizeof(pldm_package_header_information));
-    package.read(reinterpret_cast<char*>(packageHeader.data()),
-                 sizeof(pldm_package_header_information));
-
-    auto pkgHeaderInfo =
-        reinterpret_cast<const pldm_package_header_information*>(
-            packageHeader.data());
-    auto pkgHeaderInfoSize = sizeof(pldm_package_header_information) +
-                             pkgHeaderInfo->package_version_string_length;
-    packageHeader.clear();
-    packageHeader.resize(pkgHeaderInfoSize);
-    package.seekg(0);
-    package.read(reinterpret_cast<char*>(packageHeader.data()),
-                 pkgHeaderInfoSize);
+    std::vector<uint8_t> packageHeader(packageSize);
+    package.read(reinterpret_cast<char*>(packageHeader.data()), packageSize);
 
     parser = parsePkgHeader(packageHeader);
     if (parser == nullptr)
@@ -105,9 +93,6 @@
     objPath = swRootPath + std::to_string(versionHash);
 
     package.seekg(0);
-    packageHeader.resize(parser->pkgHeaderSize);
-    package.read(reinterpret_cast<char*>(packageHeader.data()),
-                 parser->pkgHeaderSize);
     try
     {
         parser->parse(packageHeader, packageSize);