Skip to content

Commit f55e51d

Browse files
committed
Fix libspdm_get_element_from_opaque_data() to allow non-zero vendor_id
Signed-off-by: Jiewen Yao <[email protected]>
1 parent d019b80 commit f55e51d

File tree

1 file changed

+39
-21
lines changed

1 file changed

+39
-21
lines changed

library/spdm_common_lib/libspdm_com_opaque_data.c

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,13 @@ bool libspdm_get_element_from_opaque_data(libspdm_context_t *spdm_context,
119119
*general_opaque_data_table_header;
120120
const spdm_general_opaque_data_table_header_t
121121
*spdm_general_opaque_data_table_header;
122-
const secured_message_opaque_element_table_header_t
122+
const opaque_element_table_header_t
123123
*opaque_element_table_header;
124+
uint16_t opaque_element_data_len;
125+
const secured_message_opaque_element_table_header_t
126+
*secured_message_element_table_header;
124127
const secured_message_opaque_element_header_t
125-
* secured_message_element_header;
128+
*secured_message_element_header;
126129

127130
bool result;
128131
uint8_t element_num;
@@ -177,19 +180,30 @@ bool libspdm_get_element_from_opaque_data(libspdm_context_t *spdm_context,
177180

178181
for (element_index = 0; element_index < element_num; element_index++) {
179182
/*ensure the opaque_element_table_header is valid*/
180-
if (total_element_len + sizeof(secured_message_opaque_element_table_header_t) >
183+
if (total_element_len + sizeof(opaque_element_table_header_t) >
181184
data_element_size) {
182185
return false;
183186
}
184187

185188
/*check element header id*/
186-
if ((opaque_element_table_header->id > SPDM_REGISTRY_ID_MAX) ||
187-
(opaque_element_table_header->vendor_len != 0)) {
189+
if ((opaque_element_table_header->id > SPDM_REGISTRY_ID_MAX)) {
190+
return false;
191+
}
192+
193+
if (total_element_len + sizeof(opaque_element_table_header_t) +
194+
opaque_element_table_header->vendor_len + 2 >
195+
data_element_size) {
188196
return false;
189197
}
190198

191-
current_element_len = sizeof(secured_message_opaque_element_table_header_t) +
192-
opaque_element_table_header->opaque_element_data_len;
199+
opaque_element_data_len = libspdm_read_uint16(
200+
(const uint8_t *)opaque_element_table_header +
201+
sizeof(opaque_element_table_header_t) +
202+
opaque_element_table_header->vendor_len);
203+
204+
current_element_len = sizeof(opaque_element_table_header_t) +
205+
opaque_element_table_header->vendor_len +
206+
2 + opaque_element_data_len;
193207
/* Add Padding*/
194208
current_element_len = (current_element_len + 3) & ~3;
195209

@@ -200,25 +214,29 @@ bool libspdm_get_element_from_opaque_data(libspdm_context_t *spdm_context,
200214
}
201215

202216
if (opaque_element_table_header->id == element_id) {
203-
secured_message_element_header = (const void *)(opaque_element_table_header + 1);
204-
if ((const uint8_t *)secured_message_element_header +
205-
sizeof(secured_message_opaque_element_header_t) >
206-
(const uint8_t *)data_in + data_in_size) {
207-
return false;
208-
}
217+
secured_message_element_table_header = (const void *)opaque_element_table_header;
218+
if (secured_message_element_table_header->vendor_len == 0) {
219+
secured_message_element_header =
220+
(const void *)(secured_message_element_table_header + 1);
221+
if ((const uint8_t *)secured_message_element_header +
222+
sizeof(secured_message_opaque_element_header_t) >
223+
(const uint8_t *)data_in + data_in_size) {
224+
return false;
225+
}
209226

210-
if ((secured_message_element_header->sm_data_id == sm_data_id) &&
211-
(secured_message_element_header->sm_data_version ==
212-
SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION)) {
213-
/*get element by element id*/
214-
*get_element_ptr = opaque_element_table_header;
215-
*get_element_len = current_element_len;
216-
result = true;
227+
if ((secured_message_element_header->sm_data_id == sm_data_id) &&
228+
(secured_message_element_header->sm_data_version ==
229+
SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION)) {
230+
/*get element by element id*/
231+
*get_element_ptr = opaque_element_table_header;
232+
*get_element_len = current_element_len;
233+
result = true;
234+
}
217235
}
218236
}
219237

220238
/*move to next element*/
221-
opaque_element_table_header = (const secured_message_opaque_element_table_header_t *)
239+
opaque_element_table_header = (const opaque_element_table_header_t *)
222240
((const uint8_t *)opaque_element_table_header +
223241
current_element_len);
224242
}

0 commit comments

Comments
 (0)