msgbuf: Define a separate msgbuf structure for encode/decode function
Define separate msgbuf structures to avoid casting away const-qualifiers
in the msgbuf constructor function:
* pldm_msgbuf_rw: for encode functions with non const-qualified buffer
* pldm_msgbuf_ro: for decode functions with const-qualified buffer
Further, use _Generic() to keep the API ergonomic while still yielding a
compile error when wrong msgbuf type is passed.
Change-Id: I71dbcb7996e9fb402b49870fce539a939c1497e5
Signed-off-by: John Chung <john.chung@arm.com>
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/src/dsp/firmware_update.c b/src/dsp/firmware_update.c
index 7381546..e7befe8 100644
--- a/src/dsp/firmware_update.c
+++ b/src/dsp/firmware_update.c
@@ -393,11 +393,11 @@
uint32_t package_header_checksum = 0;
size_t package_header_variable_size;
size_t package_header_payload_size;
+ const void *package_payload_offset;
size_t package_header_areas_size;
uint16_t package_header_size;
- void *package_payload_offset;
size_t package_payload_size;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int checksums = 1;
int rc;
@@ -511,8 +511,9 @@
return pldm_msgbuf_discard(buf, rc);
}
- pldm_msgbuf_span_required(buf, hdr->package_version_string.length,
- (void **)&hdr->package_version_string.ptr);
+ pldm_msgbuf_span_required(
+ buf, hdr->package_version_string.length,
+ (const void **)&hdr->package_version_string.ptr);
if (package_header_size < (PLDM_FWUP_PACKAGE_HEADER_FIXED_SIZE + 3 +
checksums * sizeof(uint32_t))) {
@@ -530,7 +531,7 @@
package_header_areas_size = package_header_variable_size -
hdr->package_version_string.length;
rc = pldm_msgbuf_span_required(buf, package_header_areas_size,
- (void **)&pkg->areas.ptr);
+ (const void **)&pkg->areas.ptr);
if (rc) {
return pldm_msgbuf_discard(buf, rc);
}
@@ -638,12 +639,12 @@
}
/* Currently only used for decode_firmware_device_id_record_errno() */
-static int pldm_msgbuf_init_dynamic_uint16(struct pldm_msgbuf *buf, size_t req,
- void *data, size_t len,
+static int pldm_msgbuf_init_dynamic_uint16(struct pldm_msgbuf_ro *buf,
+ size_t req, void *data, size_t len,
void **tail_data, size_t *tail_len)
{
+ const void *dyn_start;
size_t dyn_length;
- void *dyn_start;
int rc;
rc = pldm_msgbuf_init_errno(buf, req, data, len);
@@ -676,7 +677,8 @@
return pldm_msgbuf_discard(buf, rc);
}
- rc = pldm_msgbuf_span_remaining(buf, tail_data, tail_len);
+ rc = pldm_msgbuf_span_remaining(buf, (const void **)tail_data,
+ tail_len);
if (rc) {
return pldm_msgbuf_discard(buf, rc);
}
@@ -696,7 +698,7 @@
struct pldm_package_firmware_device_id_record *rec)
{
size_t firmware_device_package_data_offset;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
uint16_t record_len = 0;
int rc;
@@ -756,7 +758,7 @@
assert((hdr->component_bitmap_bit_length & 7) == 0);
rc = pldm_msgbuf_span_required(
buf, hdr->component_bitmap_bit_length / 8,
- (void **)&rec->applicable_components.bitmap.ptr);
+ (const void **)&rec->applicable_components.bitmap.ptr);
if (rc) {
return pldm_msgbuf_discard(buf, rc);
}
@@ -765,7 +767,7 @@
pldm_msgbuf_span_required(
buf, rec->component_image_set_version_string.length,
- (void **)&rec->component_image_set_version_string.ptr);
+ (const void **)&rec->component_image_set_version_string.ptr);
/* The total length reserved for `package_data` and `reference_manifest_data` */
firmware_device_package_data_offset =
@@ -773,12 +775,12 @@
rec->reference_manifest_data.length;
pldm_msgbuf_span_until(buf, firmware_device_package_data_offset,
- (void **)&rec->record_descriptors.ptr,
+ (const void **)&rec->record_descriptors.ptr,
&rec->record_descriptors.length);
pldm_msgbuf_span_required(
buf, rec->firmware_device_package_data.length,
- (void **)&rec->firmware_device_package_data.ptr);
+ (const void **)&rec->firmware_device_package_data.ptr);
if (!rec->firmware_device_package_data.length) {
rec->firmware_device_package_data.ptr = NULL;
}
@@ -787,7 +789,7 @@
PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
pldm_msgbuf_span_required(
buf, rec->reference_manifest_data.length,
- (void **)&rec->reference_manifest_data.ptr);
+ (const void **)&rec->reference_manifest_data.ptr);
} else {
assert(rec->reference_manifest_data.length == 0);
@@ -851,7 +853,7 @@
int decode_pldm_descriptor_from_iter(struct pldm_descriptor_iter *iter,
struct pldm_descriptor *desc)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!iter || !iter->field || !desc) {
@@ -872,9 +874,9 @@
desc->descriptor_data = NULL;
pldm_msgbuf_span_required(buf, desc->descriptor_length,
- (void **)&desc->descriptor_data);
+ (const void **)&desc->descriptor_data);
iter->field->ptr = NULL;
- pldm_msgbuf_span_remaining(buf, (void **)&iter->field->ptr,
+ pldm_msgbuf_span_remaining(buf, (const void **)&iter->field->ptr,
&iter->field->length);
return pldm_msgbuf_complete(buf);
@@ -1149,7 +1151,7 @@
const struct pldm_descriptor *descriptors, struct pldm_msg *msg,
size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (descriptors == NULL || msg == NULL || payload_length == NULL) {
@@ -1324,7 +1326,7 @@
const struct pldm_get_firmware_parameters_resp_full *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (resp_data == NULL || msg == NULL || payload_length == NULL) {
@@ -1380,7 +1382,7 @@
const struct pldm_component_parameter_entry_full *comp,
uint8_t *payload, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (comp == NULL || payload == NULL || payload_length == NULL) {
@@ -1530,7 +1532,7 @@
const struct pldm_msg *msg, size_t payload_length,
struct pldm_query_downstream_devices_resp *resp_data)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (msg == NULL || resp_data == NULL || !payload_length) {
@@ -1580,7 +1582,7 @@
const struct pldm_query_downstream_identifiers_req *params_req,
struct pldm_msg *msg, size_t payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (!msg || !params_req) {
@@ -1623,8 +1625,8 @@
struct pldm_query_downstream_identifiers_resp *resp_data,
struct pldm_downstream_device_iter *iter)
{
- PLDM_MSGBUF_DEFINE_P(buf);
- void *remaining = NULL;
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
+ const void *remaining = NULL;
int rc = 0;
if (msg == NULL || resp_data == NULL || iter == NULL ||
@@ -1679,7 +1681,7 @@
struct pldm_downstream_device_iter *iter,
struct pldm_downstream_device *dev)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!iter || !iter->field.ptr || !dev) {
@@ -1694,7 +1696,7 @@
pldm_msgbuf_extract(buf, dev->downstream_device_index);
pldm_msgbuf_extract(buf, dev->downstream_descriptor_count);
- pldm_msgbuf_span_remaining(buf, (void **)&iter->field.ptr,
+ pldm_msgbuf_span_remaining(buf, (const void **)&iter->field.ptr,
&iter->field.length);
return pldm_msgbuf_complete(buf);
@@ -1706,7 +1708,7 @@
const struct pldm_get_downstream_firmware_parameters_req *params_req,
struct pldm_msg *msg, size_t payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (!msg || !params_req) {
@@ -1749,8 +1751,8 @@
struct pldm_get_downstream_firmware_parameters_resp *resp_data,
struct pldm_downstream_device_parameters_iter *iter)
{
- PLDM_MSGBUF_DEFINE_P(buf);
- void *remaining = NULL;
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
+ const void *remaining = NULL;
size_t length;
int rc;
@@ -1805,10 +1807,10 @@
struct pldm_downstream_device_parameters_iter *iter,
struct pldm_downstream_device_parameters_entry *entry)
{
- PLDM_MSGBUF_DEFINE_P(buf);
- void *comp_ver_str;
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
+ const void *comp_ver_str;
+ const void *cursor;
size_t remaining;
- void *cursor;
int rc;
if (iter == NULL || iter->field.ptr == NULL || entry == NULL) {
@@ -1894,7 +1896,7 @@
const struct pldm_request_downstream_device_update_req *req_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (!req_data || !msg || !payload_length ||
@@ -1935,7 +1937,7 @@
struct pldm_request_downstream_device_update_req *req)
{
int rc;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
if (!msg || !req) {
return -EINVAL;
@@ -1961,7 +1963,7 @@
const struct pldm_request_downstream_device_update_resp *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (!resp_data || !msg || !payload_length) {
@@ -1997,7 +1999,7 @@
const struct pldm_msg *msg, size_t payload_length,
struct pldm_request_downstream_device_update_resp *resp_data)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!msg || !resp_data) {
@@ -2094,7 +2096,7 @@
{
int rc;
uint8_t t;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
if (msg == NULL || req == NULL) {
return -EINVAL;
@@ -2167,7 +2169,7 @@
const struct pldm_request_update_resp *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2266,7 +2268,7 @@
{
int rc;
uint8_t t;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
if (msg == NULL || pcomp == NULL) {
return -EINVAL;
@@ -2348,7 +2350,7 @@
const struct pldm_pass_component_table_resp *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2439,7 +2441,7 @@
{
int rc;
uint8_t t;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
if (msg == NULL || up == NULL) {
return -EINVAL;
@@ -2531,7 +2533,7 @@
uint8_t instance_id, const struct pldm_update_component_resp *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2587,7 +2589,7 @@
const struct pldm_request_firmware_data_req *req_params,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2657,7 +2659,7 @@
int encode_transfer_complete_req(uint8_t instance_id, uint8_t transfer_result,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2727,7 +2729,7 @@
int encode_verify_complete_req(uint8_t instance_id, uint8_t verify_result,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2811,7 +2813,7 @@
const struct pldm_apply_complete_req *req_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -2868,7 +2870,7 @@
size_t payload_length, bool *self_contained)
{
uint8_t self_contained_u8 = 0;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (msg == NULL || self_contained == NULL) {
@@ -2962,7 +2964,7 @@
const struct pldm_activate_firmware_resp *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -3083,7 +3085,7 @@
const struct pldm_get_status_resp *status,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (status == NULL || msg == NULL || payload_length == NULL) {
@@ -3229,7 +3231,7 @@
const struct pldm_cancel_update_resp *resp_data,
struct pldm_msg *msg, size_t *payload_length)
{
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RW_DEFINE_P(buf);
int rc;
if (msg == NULL || payload_length == NULL) {
@@ -3278,7 +3280,7 @@
int pldm_package_firmware_device_id_record_iter_init(struct pldm_package *pkg)
{
struct pldm_package_iter *iter;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!pkg || !pkg->pin || !pkg->hdr) {
@@ -3315,7 +3317,7 @@
}
pldm_msgbuf_extract_uint8_to_size(buf, iter->entries);
- pldm_msgbuf_span_remaining(buf, (void **)&iter->field.ptr,
+ pldm_msgbuf_span_remaining(buf, (const void **)&iter->field.ptr,
&iter->field.length);
return pldm_msgbuf_complete(buf);
@@ -3342,7 +3344,7 @@
int pldm_package_downstream_device_id_record_iter_init(struct pldm_package *pkg)
{
struct pldm_package_iter *iter;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!pkg || !pkg->pin || !pkg->hdr) {
@@ -3396,7 +3398,7 @@
}
pldm_msgbuf_extract_uint8_to_size(buf, iter->entries);
- pldm_msgbuf_span_remaining(buf, (void **)&iter->field.ptr,
+ pldm_msgbuf_span_remaining(buf, (const void **)&iter->field.ptr,
&iter->field.length);
return pldm_msgbuf_complete(buf);
@@ -3410,7 +3412,7 @@
{
struct pldm_package_iter *iter;
size_t package_data_offset;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
uint16_t record_len = 0;
int rc;
@@ -3478,7 +3480,7 @@
assert((pkg->hdr->component_bitmap_bit_length & 7) == 0);
rc = pldm_msgbuf_span_required(
buf, pkg->hdr->component_bitmap_bit_length / 8,
- (void **)&rec->applicable_components.bitmap.ptr);
+ (const void **)&rec->applicable_components.bitmap.ptr);
if (rc) {
return pldm_msgbuf_discard(buf, rc);
}
@@ -3487,7 +3489,8 @@
pldm_msgbuf_span_required(
buf, rec->self_contained_activation_min_version_string.length,
- (void **)&rec->self_contained_activation_min_version_string.ptr);
+ (const void **)&rec
+ ->self_contained_activation_min_version_string.ptr);
if (rec->update_option_flags.bits.bit0) {
pldm_msgbuf_extract(
buf,
@@ -3501,18 +3504,18 @@
rec->package_data.length + rec->reference_manifest_data.length;
pldm_msgbuf_span_until(buf, package_data_offset,
- (void **)&rec->record_descriptors.ptr,
+ (const void **)&rec->record_descriptors.ptr,
&rec->record_descriptors.length);
pldm_msgbuf_span_required(buf, rec->package_data.length,
- (void **)&rec->package_data.ptr);
+ (const void **)&rec->package_data.ptr);
/* Supported in package header revision 1.3 (FR04H) and above. */
if (pkg->hdr->package_header_format_revision >=
PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
pldm_msgbuf_span_required(
buf, rec->reference_manifest_data.length,
- (void **)&rec->reference_manifest_data.ptr);
+ (const void **)&rec->reference_manifest_data.ptr);
} else {
assert(rec->reference_manifest_data.length == 0);
rec->reference_manifest_data.ptr = NULL;
@@ -3526,7 +3529,7 @@
{
struct pldm_package_iter *iter;
uint16_t component_image_count;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!pkg || !pkg->pin || !pkg->hdr) {
@@ -3576,7 +3579,7 @@
}
iter->entries = component_image_count;
- pldm_msgbuf_span_remaining(buf, (void **)&iter->field.ptr,
+ pldm_msgbuf_span_remaining(buf, (const void **)&iter->field.ptr,
&iter->field.length);
return pldm_msgbuf_complete(buf);
@@ -3591,7 +3594,7 @@
uint32_t component_location_offset = 0;
struct pldm_package_iter *iter;
uint32_t component_size = 0;
- PLDM_MSGBUF_DEFINE_P(buf);
+ PLDM_MSGBUF_RO_DEFINE_P(buf);
int rc;
if (!pkg || !info) {
@@ -3637,8 +3640,9 @@
return pldm_msgbuf_discard(buf, rc);
}
- pldm_msgbuf_span_required(buf, info->component_version_string.length,
- (void **)&info->component_version_string.ptr);
+ pldm_msgbuf_span_required(
+ buf, info->component_version_string.length,
+ (const void **)&info->component_version_string.ptr);
/* Supported in package header revision 1.2 (FR03H) and above. */
if (pkg->hdr->package_header_format_revision >=
@@ -3650,7 +3654,7 @@
}
pldm_msgbuf_span_required(
buf, info->component_opaque_data.length,
- (void **)&info->component_opaque_data.ptr);
+ (const void **)&info->component_opaque_data.ptr);
} else {
info->component_opaque_data.length = 0;
}
@@ -3659,7 +3663,7 @@
info->component_opaque_data.ptr = NULL;
}
- pldm_msgbuf_span_remaining(buf, (void **)&iter->field.ptr,
+ pldm_msgbuf_span_remaining(buf, (const void **)&iter->field.ptr,
&iter->field.length);
rc = pldm_msgbuf_complete_consumed(buf);
@@ -3681,7 +3685,7 @@
pldm_msgbuf_span_required(buf, component_location_offset, NULL);
pldm_msgbuf_span_required(buf, component_size,
- (void **)&info->component_image.ptr);
+ (const void **)&info->component_image.ptr);
rc = pldm_msgbuf_complete(buf);
if (rc) {