xref: /openbmc/libpldm/src/oem/meta/file_io.c (revision 615344fc)
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