From 7261970ae5fa3c78bd848d593d50ae0b33a78ca5 Mon Sep 17 00:00:00 2001 From: Jaeyun Date: Fri, 18 Nov 2022 18:10:39 +0900 Subject: [PATCH] [Util] util function to allocate memory Fix svace issue - size limit to allocate memory. Add util function for mem allocation, checking max size before calling malloc. Signed-off-by: Jaeyun --- src/libnnstreamer-edge/nnstreamer-edge-data.c | 2 +- .../nnstreamer-edge-internal.c | 4 +-- .../nnstreamer-edge-metadata.c | 2 +- src/libnnstreamer-edge/nnstreamer-edge-util.c | 29 ++++++++++++++----- src/libnnstreamer-edge/nnstreamer-edge-util.h | 14 +++++++++ 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/libnnstreamer-edge/nnstreamer-edge-data.c b/src/libnnstreamer-edge/nnstreamer-edge-data.c index 6c35264..439aa03 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-data.c +++ b/src/libnnstreamer-edge/nnstreamer-edge-data.c @@ -485,7 +485,7 @@ nns_edge_data_serialize (nns_edge_data_h data_h, void **data, nns_size_t * len) total = header_len + data_len + edata_header.meta_len; - serialized = ptr = (char *) malloc (total); + serialized = ptr = (char *) nns_edge_malloc (total); if (!serialized) { ret = NNS_EDGE_ERROR_OUT_OF_MEMORY; goto done; diff --git a/src/libnnstreamer-edge/nnstreamer-edge-internal.c b/src/libnnstreamer-edge/nnstreamer-edge-internal.c index b8657f9..524c9e8 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-internal.c +++ b/src/libnnstreamer-edge/nnstreamer-edge-internal.c @@ -396,7 +396,7 @@ _nns_edge_cmd_receive (nns_edge_conn_s * conn, nns_edge_cmd_s * cmd) } for (n = 0; n < cmd->info.num; n++) { - cmd->mem[n] = malloc (cmd->info.mem_size[n]); + cmd->mem[n] = nns_edge_malloc (cmd->info.mem_size[n]); if (!cmd->mem[n]) { nns_edge_loge ("Failed to allocate memory to receive data from socket."); ret = NNS_EDGE_ERROR_OUT_OF_MEMORY; @@ -411,7 +411,7 @@ _nns_edge_cmd_receive (nns_edge_conn_s * conn, nns_edge_cmd_s * cmd) } if (cmd->info.meta_size > 0) { - cmd->meta = malloc (cmd->info.meta_size); + cmd->meta = nns_edge_malloc (cmd->info.meta_size); if (!cmd->meta) { nns_edge_loge ("Failed to allocate memory to receive meta from socket."); ret = NNS_EDGE_ERROR_OUT_OF_MEMORY; diff --git a/src/libnnstreamer-edge/nnstreamer-edge-metadata.c b/src/libnnstreamer-edge/nnstreamer-edge-metadata.c index 81b2e59..fcc3e89 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-metadata.c +++ b/src/libnnstreamer-edge/nnstreamer-edge-metadata.c @@ -295,7 +295,7 @@ nns_edge_metadata_serialize (nns_edge_metadata_h metadata_h, node = node->next; } - serialized = ptr = (char *) malloc (total); + serialized = ptr = (char *) nns_edge_malloc (total); if (!serialized) return NNS_EDGE_ERROR_OUT_OF_MEMORY; diff --git a/src/libnnstreamer-edge/nnstreamer-edge-util.c b/src/libnnstreamer-edge/nnstreamer-edge-util.c index 3b78083..081db8b 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-util.c +++ b/src/libnnstreamer-edge/nnstreamer-edge-util.c @@ -109,6 +109,24 @@ nns_edge_parse_port_number (const char *port_str) return port; } +/** + * @brief Allocate new memory. The max size is SIZE_MAX. + * @note Caller should release newly allocated memory using nns_edge_free(). + */ +void * +nns_edge_malloc (nns_size_t size) +{ + void *mem = NULL; + + if (size > 0 && size <= SIZE_MAX) + mem = malloc (size); + + if (!mem) + nns_edge_loge ("Failed to allocate memory (%llu).", size); + + return mem; +} + /** * @brief Free allocated memory. */ @@ -129,13 +147,10 @@ nns_edge_memdup (const void *data, nns_size_t size) void *mem = NULL; if (data && size > 0) { - mem = malloc (size); + mem = nns_edge_malloc (size); - if (mem) { + if (mem) memcpy (mem, data, size); - } else { - nns_edge_loge ("Failed to allocate memory (%llu).", size); - } } return mem; @@ -166,13 +181,11 @@ nns_edge_strndup (const char *str, nns_size_t len) char *new_str = NULL; if (str) { - new_str = (char *) malloc (len + 1); + new_str = (char *) nns_edge_malloc (len + 1); if (new_str) { strncpy (new_str, str, len); new_str[len] = '\0'; - } else { - nns_edge_loge ("Failed to allocate memory (%llu).", len + 1); } } diff --git a/src/libnnstreamer-edge/nnstreamer-edge-util.h b/src/libnnstreamer-edge/nnstreamer-edge-util.h index 8e6a880..e2302f8 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-util.h +++ b/src/libnnstreamer-edge/nnstreamer-edge-util.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "nnstreamer-edge.h" #ifdef __cplusplus @@ -41,6 +42,13 @@ extern "C" { #define FALSE (0) #endif +/** + * @brief The max size to allocate memory. This would be defined in C99 limits.h. + */ +#ifndef SIZE_MAX +#define SIZE_MAX ((size_t) -1) +#endif + #define STR_IS_VALID(s) ((s) && (s)[0] != '\0') #define PORT_IS_VALID(p) ((p) > 0 && (p) <= 65535) #define SAFE_FREE(p) do { if (p) { free (p); (p) = NULL; } } while (0) @@ -85,6 +93,12 @@ void nns_edge_parse_host_string (const char *host_str, char **host, int *port); */ int nns_edge_parse_port_number (const char *port_str); +/** + * @brief Allocate new memory. The max size is SIZE_MAX. + * @note Caller should release newly allocated memory using nns_edge_free(). + */ +void *nns_edge_malloc (nns_size_t size); + /** * @brief Free allocated memory. */ -- 2.34.1