dsp: firmware_update: Reimplement decode_pldm_package_header_info_errno()
Do so in terms of the msgbuf APIs for safety, correctness, ergonomics
and performance.
decode_pldm_package_header_info() is re-implemented in terms of the
reworked API for decode_pldm_package_header_info_errno(). This gives us
a common implementation that will be exploited by future changes, with
the accommodations kept on the exceptional path.
gitlint-ignore: T1
Change-Id: Ia57fa007e5896b63e18063704787bbbc3c89f8e2
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/tests/dsp/firmware_update.cpp b/tests/dsp/firmware_update.cpp
index 05b8dd1..e12b4de 100644
--- a/tests/dsp/firmware_update.cpp
+++ b/tests/dsp/firmware_update.cpp
@@ -48,26 +48,25 @@
0x05, 0x9a, 0xca, 0x02};
static constexpr uint8_t PLDM_FWUP_PACKAGE_HEADER_FORMAT_REVISION_V1_0 = 0x01;
+static constexpr size_t PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 = 43;
+
+static constexpr std::array<uint8_t, PLDM_TIMESTAMP104_SIZE>
+ testPackageReleaseDateTime{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00};
TEST(DecodePackageHeaderInfo, goodPath)
{
- // Random PackageHeaderSize
- constexpr uint16_t pkgHeaderSize = 303;
- // PackageReleaseDateTime - "25/12/2021 00:00:00"
- std::array<uint8_t, PLDM_TIMESTAMP104_SIZE> package_release_date_time{
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00};
constexpr uint16_t componentBitmapBitLength = 8;
- // PackageVersionString
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
constexpr std::array<uint8_t, packageHeaderSize> packagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2f,
- 0x05, 0x9a, 0xca, 0x02, 0x01, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x01, 0x0b,
- 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x61, 0xe3, 0x64, 0x6e};
pldm_package_header_information pkgHeader{};
variable_field packageVersion{};
@@ -75,19 +74,19 @@
packagerHeaderInfo.size(),
&pkgHeader, &packageVersion);
- EXPECT_EQ(rc, PLDM_SUCCESS);
+ ASSERT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(true,
std::equal(pkgHeader.uuid, pkgHeader.uuid + PLDM_FWUP_UUID_LENGTH,
PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_0.begin(),
PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_0.end()));
EXPECT_EQ(pkgHeader.package_header_format_version,
PLDM_FWUP_PACKAGE_HEADER_FORMAT_REVISION_V1_0);
- EXPECT_EQ(pkgHeader.package_header_size, pkgHeaderSize);
+ EXPECT_EQ(pkgHeader.package_header_size, packageHeaderSize);
EXPECT_EQ(true, std::equal(pkgHeader.package_release_date_time,
pkgHeader.package_release_date_time +
PLDM_TIMESTAMP104_SIZE,
- package_release_date_time.begin(),
- package_release_date_time.end()));
+ testPackageReleaseDateTime.begin(),
+ testPackageReleaseDateTime.end()));
EXPECT_EQ(pkgHeader.component_bitmap_bit_length, componentBitmapBitLength);
EXPECT_EQ(pkgHeader.package_version_string_type, PLDM_STR_TYPE_ASCII);
EXPECT_EQ(pkgHeader.package_version_string_length,
@@ -103,13 +102,14 @@
{
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
constexpr std::array<uint8_t, packageHeaderSize> packagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2f,
- 0x05, 0x9a, 0xca, 0x02, 0x01, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x01, 0x0b,
- 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
pldm_package_header_information packageHeader{};
variable_field packageVersion{};
@@ -134,35 +134,95 @@
{
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
constexpr std::array<uint8_t, packageHeaderSize> packagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2f,
- 0x05, 0x9a, 0xca, 0x02, 0x01, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x01, 0x0b,
- 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
pldm_package_header_information packageHeader{};
variable_field packageVersion{};
int rc = 0;
- rc = decode_pldm_package_header_info(
- packagerHeaderInfo.data(), sizeof(pldm_package_header_information) - 1,
- &packageHeader, &packageVersion);
+ rc = decode_pldm_package_header_info(packagerHeaderInfo.data(), 0,
+ &packageHeader, &packageVersion);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+ rc = decode_pldm_package_header_info(packagerHeaderInfo.data(), 35,
+ &packageHeader, &packageVersion);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+ rc = decode_pldm_package_header_info(packagerHeaderInfo.data(), 36,
+ &packageHeader, &packageVersion);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+ rc = decode_pldm_package_header_info(packagerHeaderInfo.data(),
+ packagerHeaderInfo.size() - 1,
+ &packageHeader, &packageVersion);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(DecodePackageHeaderInfo, unspecifiedPackageHeaderIdentifier)
+{
+ constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
+ constexpr size_t packageHeaderSize =
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
+
+ constexpr std::array<uint8_t, packageHeaderSize> packagerHeaderInfo{
+ 0xff, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
+
+ pldm_package_header_information packageHeader{};
+ variable_field packageVersion{};
+ int rc = 0;
+
+ rc = decode_pldm_package_header_info(packagerHeaderInfo.data(),
+ packagerHeaderInfo.size(),
+ &packageHeader, &packageVersion);
+ EXPECT_EQ(rc, PLDM_ERROR);
+}
+
+TEST(DecodePackageHeaderInfo, incongruentPackageHeaderFormatRevision)
+{
+ constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
+ constexpr size_t packageHeaderSize =
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + 1 + packageVersionStr.size();
+
+ constexpr std::array<uint8_t, packageHeaderSize> packagerHeaderInfo{
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x37, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
+
+ pldm_package_header_information packageHeader{};
+ variable_field packageVersion{};
+ int rc = 0;
+
+ rc = decode_pldm_package_header_info(packagerHeaderInfo.data(),
+ packagerHeaderInfo.size(),
+ &packageHeader, &packageVersion);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(DecodePackageHeaderInfo, invalidPackageVersionStringType)
{
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
constexpr std::array<uint8_t, packageHeaderSize> invalidPackagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2f,
- 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x06, 0x0b,
- 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x06, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
pldm_package_header_information packageHeader{};
variable_field packageVersion{};
@@ -178,13 +238,14 @@
{
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
constexpr std::array<uint8_t, packageHeaderSize> invalidPackagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2f,
- 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00,
- 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x00, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
pldm_package_header_information packageHeader{};
variable_field packageVersion{};
@@ -200,15 +261,14 @@
{
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
- constexpr std::array<uint8_t, packageHeaderSize - 1>
- invalidPackagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
- 0xa0, 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
- 0x07, 0x00, 0x08, 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
- 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e};
+ constexpr std::array<uint8_t, packageHeaderSize> invalidPackagerHeaderInfo{
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08,
+ 0x00, 0x01, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
pldm_package_header_information packageHeader{};
variable_field packageVersion{};
@@ -224,13 +284,37 @@
{
constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
constexpr size_t packageHeaderSize =
- sizeof(pldm_package_header_information) + packageVersionStr.size();
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
constexpr std::array<uint8_t, packageHeaderSize> invalidPackagerHeaderInfo{
- 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2f,
- 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x09, 0x00, 0x01, 0x0b,
- 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x07,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
+
+ pldm_package_header_information packageHeader{};
+ variable_field packageVersion{};
+ int rc = 0;
+
+ rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo.data(),
+ invalidPackagerHeaderInfo.size(),
+ &packageHeader, &packageVersion);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(DecodePackageHeaderInfo, badChecksum)
+{
+ constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
+ constexpr size_t packageHeaderSize =
+ PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 + packageVersionStr.size();
+
+ constexpr std::array<uint8_t, packageHeaderSize> invalidPackagerHeaderInfo{
+ 0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0,
+ 0x2f, 0x05, 0x9a, 0xca, 0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x10,
+ 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76,
+ 0x31, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x96, 0x8b, 0x5b, 0xcc};
pldm_package_header_information packageHeader{};
variable_field packageVersion{};