1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ 2 #include <libpldm/oem/meta/file_io.h> 3 #include <endian.h> 4 #include <string.h> 5 #include <stdio.h> 6 #include "msgbuf.h" 7 8 #define PLDM_OEM_META_DECODE_WRITE_FILE_IO_MIN_SIZE 6 9 LIBPLDM_ABI_STABLE 10 int decode_oem_meta_file_io_req(const struct pldm_msg *msg, 11 size_t payload_length, uint8_t *file_handle, 12 uint32_t *length, uint8_t *data) 13 { 14 struct pldm_msgbuf _buf; 15 struct pldm_msgbuf *buf = &_buf; 16 int rc; 17 18 if (msg == NULL || file_handle == NULL || length == NULL || 19 data == NULL) { 20 return PLDM_ERROR_INVALID_DATA; 21 } 22 23 rc = pldm_msgbuf_init_cc(buf, 24 PLDM_OEM_META_DECODE_WRITE_FILE_IO_MIN_SIZE, 25 msg->payload, payload_length); 26 if (rc) { 27 return rc; 28 } 29 30 pldm_msgbuf_extract_p(buf, file_handle); 31 pldm_msgbuf_extract_p(buf, length); 32 33 /* NOTE: Memory safety failure */ 34 rc = pldm_msgbuf_extract_array_uint8(buf, (size_t)(*length), data, 35 UINT32_MAX); 36 if (rc) { 37 return rc; 38 } 39 40 return pldm_msgbuf_destroy_consumed(buf); 41 } 42