blob: dac099003af358dcc7aee65c82f61b5530d841b6 [file]
From 92388b2c470dd4b01bf47902132349319b8f0cd6 Mon Sep 17 00:00:00 2001
From: Kasun Athukorala <kasunath@google.com>
Date: Fri, 5 Sep 2025 18:50:26 +0000
Subject: [PATCH] dsp: base: Fix MultipartReceive Request decoding
This fix is based on DSP0240 v1.2.0 section 9.6.5 MultipartReceive.
- Removed RequestedSectionOffset check.
The Property can be 0 for any TransferOperation flag.
- Changed DataTransferHandle check.
The property can be 0 except with PLDM_XFER_NEXT_PART. Eg. In
DSP0242 v1.0.0, when using MultipartReceive to read a file,
the client has to send transfer handle 0 with XFER_FIRST_PART.
Change-Id: I06428556f9dee341de97f72b015ed0347adc9454
Signed-off-by: Kasun Athukorala <kasunath@google.com>
---
CHANGELOG.md | 4 ++++
src/dsp/base.c | 11 ++++-------
tests/dsp/base.cpp | 37 -------------------------------------
3 files changed, 8 insertions(+), 44 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9f28c0d..b28a4fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -96,6 +96,10 @@ Change categories:
- include, tests: Address concerns from -Wsign-compare
- dsp: base: decode_pldm_base_negotiate_transfer_params_resp() is stable
+- base:
+ - Removed RequestedSectionOffset check in decode_multipart_receive_req()
+ - Updated DataTransferHandle check in decode_multipart_receive_req()
+
### Security
## [0.14.0] 2025-08-11
diff --git a/src/dsp/base.c b/src/dsp/base.c
index cc805df..eb0aaa4 100644
--- a/src/dsp/base.c
+++ b/src/dsp/base.c
@@ -569,13 +569,10 @@ int decode_multipart_receive_req(const struct pldm_msg *msg,
return PLDM_ERROR_UNEXPECTED_TRANSFER_FLAG_OPERATION;
}
- // A section offset of 0 is only valid on FIRST_PART or COMPLETE Xfers.
- if (*section_offset == 0 && (*transfer_opflag != PLDM_XFER_FIRST_PART &&
- *transfer_opflag != PLDM_XFER_COMPLETE)) {
- return PLDM_ERROR_INVALID_DATA;
- }
-
- if (*transfer_handle == 0 && *transfer_opflag != PLDM_XFER_COMPLETE) {
+ // Transfer handle can be 0 only if the transfer flag is one of XFER_FIRST_PART,
+ // PLDM_XFER_CURRENT_PART, XFER_ABORT or XFER_COMPLETE.
+ if ((*transfer_handle == 0) &&
+ (*transfer_opflag == PLDM_XFER_NEXT_PART)) {
return PLDM_ERROR_INVALID_DATA;
}
diff --git a/tests/dsp/base.cpp b/tests/dsp/base.cpp
index f146e7c..b2e9294 100644
--- a/tests/dsp/base.cpp
+++ b/tests/dsp/base.cpp
@@ -674,43 +674,6 @@ TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadTransferFlag)
PLDM_ERROR_UNEXPECTED_TRANSFER_FLAG_OPERATION);
}
-TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadOffset)
-{
- constexpr uint8_t kPldmType = PLDM_BASE;
- constexpr uint8_t kFlag = PLDM_XFER_NEXT_PART;
- constexpr uint32_t kTransferCtx = 0x01;
- constexpr uint32_t kTransferHandle = 0x01;
- constexpr uint32_t kSectionOffset = 0x0;
-
- PLDM_MSG_DEFINE_P(msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
- PLDM_MSGBUF_RW_DEFINE_P(buf);
- int rc;
-
- // Header values don't matter for this test.
- rc = pldm_msgbuf_init_errno(buf, PLDM_MULTIPART_RECEIVE_REQ_BYTES,
- msg->payload, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
- ASSERT_EQ(rc, 0);
- pldm_msgbuf_insert_uint8(buf, kPldmType);
- pldm_msgbuf_insert_uint8(buf, kFlag);
- pldm_msgbuf_insert_uint32(buf, kTransferCtx);
- pldm_msgbuf_insert_uint32(buf, kTransferHandle);
- pldm_msgbuf_insert_uint32(buf, kSectionOffset);
- rc = pldm_msgbuf_complete(buf);
- ASSERT_EQ(rc, 0);
-
- uint8_t pldm_type;
- uint8_t flag;
- uint32_t transfer_ctx;
- uint32_t transfer_handle;
- uint32_t section_offset;
- uint32_t section_length;
- EXPECT_EQ(decode_multipart_receive_req(
- msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES, &pldm_type, &flag,
- &transfer_ctx, &transfer_handle, &section_offset,
- &section_length),
- PLDM_ERROR_INVALID_DATA);
-}
-
TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadHandle)
{
constexpr uint8_t kPldmType = PLDM_BASE;
--
2.51.0.536.g15c5d4f767-goog