platform: pldm_msgbuf for decode_set_state_effecter_states_req()
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Change-Id: Iad0353903aad5b895ecd6fc823273a499958cb4c
diff --git a/src/platform.c b/src/platform.c
index ef990bc..3913da1 100644
--- a/src/platform.c
+++ b/src/platform.c
@@ -236,12 +236,18 @@
return PLDM_SUCCESS;
}
+#define PLDM_SET_STATE_EFFECTER_STATES_MIN_SIZE 3
int decode_set_state_effecter_states_req(const struct pldm_msg *msg,
size_t payload_length,
uint16_t *effecter_id,
uint8_t *comp_effecter_count,
set_effecter_state_field *field)
{
+ struct pldm_msgbuf _buf;
+ struct pldm_msgbuf *buf = &_buf;
+ int rc;
+ int i;
+
if (msg == NULL || effecter_id == NULL || comp_effecter_count == NULL ||
field == NULL) {
return PLDM_ERROR_INVALID_DATA;
@@ -251,15 +257,25 @@
return PLDM_ERROR_INVALID_LENGTH;
}
- struct pldm_set_state_effecter_states_req *request =
- (struct pldm_set_state_effecter_states_req *)msg->payload;
+ rc = pldm_msgbuf_init(buf, PLDM_SET_STATE_EFFECTER_STATES_MIN_SIZE,
+ msg->payload, payload_length);
+ if (rc) {
+ return rc;
+ }
- *effecter_id = le16toh(request->effecter_id);
- *comp_effecter_count = request->comp_effecter_count;
- memcpy(field, request->field,
- (sizeof(set_effecter_state_field) * (*comp_effecter_count)));
+ pldm_msgbuf_extract(buf, effecter_id);
+ pldm_msgbuf_extract(buf, comp_effecter_count);
- return PLDM_SUCCESS;
+ if (*comp_effecter_count > 8) {
+ return PLDM_ERROR_INVALID_DATA;
+ }
+
+ for (i = 0; i < *comp_effecter_count; i++) {
+ pldm_msgbuf_extract(buf, &field[i].set_request);
+ pldm_msgbuf_extract(buf, &field[i].effecter_state);
+ }
+
+ return pldm_msgbuf_destroy(buf);
}
int decode_get_pdr_req(const struct pldm_msg *msg, size_t payload_length,