[Data] util to check serialized data accepted/tizen/unified/20221226.070011
authorJaeyun <jy1210.jung@samsung.com>
Tue, 6 Dec 2022 11:00:29 +0000 (20:00 +0900)
committerjaeyun-jung <39614140+jaeyun-jung@users.noreply.github.com>
Mon, 12 Dec 2022 05:26:25 +0000 (14:26 +0900)
Add util function to check serialized data ptr.

Signed-off-by: Jaeyun <jy1210.jung@samsung.com>
src/libnnstreamer-edge/nnstreamer-edge-data.c
src/libnnstreamer-edge/nnstreamer-edge-data.h
tests/unittest_nnstreamer-edge.cc

index 874ab302c972f26372ba67b377b5535526cd5145..f81b8c9e81cb8ee8c16326d285907728582cf9bf 100644 (file)
 #include "nnstreamer-edge-log.h"
 #include "nnstreamer-edge-util.h"
 
+#define NNS_EDGE_DATA_KEY (0xeddaedda)
+
 /**
  * @brief Internal data structure for the header of the serialzied edge data.
  */
 typedef struct
 {
+  uint32_t key;
   uint32_t num_mem;
   nns_size_t data_len[NNS_EDGE_DATA_LIMIT];
   nns_size_t meta_len;
@@ -472,6 +475,7 @@ nns_edge_data_serialize (nns_edge_data_h data_h, void **data, nns_size_t * len)
   header_len = sizeof (nns_edge_data_header_s);
 
   data_len = 0;
+  edata_header.key = NNS_EDGE_DATA_KEY;
   edata_header.num_mem = ed->num;
   for (n = 0; n < ed->num; n++) {
     edata_header.data_len[n] = ed->data[n].data_len;
@@ -525,7 +529,6 @@ nns_edge_data_deserialize (nns_edge_data_h data_h, const void *data,
   nns_edge_data_header_s *header;
   int ret;
   unsigned int n;
-  nns_size_t total;
   char *ptr;
 
   ed = (nns_edge_data_s *) data_h;
@@ -539,21 +542,12 @@ nns_edge_data_deserialize (nns_edge_data_h data_h, const void *data,
     return NNS_EDGE_ERROR_INVALID_PARAMETER;
   }
 
+  ret = nns_edge_data_is_serialized (data, data_len);
+  if (ret != NNS_EDGE_ERROR_NONE)
+    return ret;
+
   nns_edge_lock (ed);
   header = (nns_edge_data_header_s *) data;
-
-  /* Check mem size */
-  total = sizeof (nns_edge_data_header_s) + header->meta_len;
-  for (n = 0; n < header->num_mem; n++) {
-    total += header->data_len[n];
-  }
-
-  if (total != data_len) {
-    nns_edge_loge ("Invalid data size to deserialize edge data.");
-    ret = NNS_EDGE_ERROR_INVALID_PARAMETER;
-    goto error;
-  }
-
   ptr = (char *) data + sizeof (nns_edge_data_header_s);
 
   ed->num = header->num_mem;
@@ -567,7 +561,40 @@ nns_edge_data_deserialize (nns_edge_data_h data_h, const void *data,
 
   ret = nns_edge_metadata_deserialize (ed->metadata, ptr, header->meta_len);
 
-error:
   nns_edge_unlock (ed);
   return ret;
 }
+
+/**
+ * @brief Check given data is serialized buffer.
+ */
+int
+nns_edge_data_is_serialized (const void *data, const nns_size_t data_len)
+{
+  nns_edge_data_header_s *header;
+  nns_size_t total;
+  unsigned int n;
+
+  if (!data) {
+    nns_edge_loge ("Invalid param, given data is null.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  header = (nns_edge_data_header_s *) data;
+  if (header->key != NNS_EDGE_DATA_KEY) {
+    nns_edge_loge ("Invalid param, given data has invalid format.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  /* Check mem size */
+  total = sizeof (nns_edge_data_header_s) + header->meta_len;
+  for (n = 0; n < header->num_mem; n++)
+    total += header->data_len[n];
+
+  if (total != data_len) {
+    nns_edge_loge ("Invalid param, given data has invalid data size.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  return NNS_EDGE_ERROR_NONE;
+}
index fea984cba3225b8cd94cdc960e2de4268b23ad68..7528c171fa6a3aea84dcddc7bb74bac9f52ca42c 100644 (file)
@@ -56,6 +56,12 @@ int nns_edge_data_serialize (nns_edge_data_h data_h, void **data, nns_size_t *da
  */
 int nns_edge_data_deserialize (nns_edge_data_h data_h, const void *data, const nns_size_t data_len);
 
+/**
+ * @brief Check given data is serialized buffer.
+ * @note This is internal function, DO NOT export this.
+ */
+int nns_edge_data_is_serialized (const void *data, const nns_size_t data_len);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index cb850412cdde4135dc05101242f57da245986fd9..2e85699d5795d08166b80b818cb64b7f75086083 100644 (file)
@@ -2257,6 +2257,65 @@ TEST(edgeDataDeserialize, invalidParam04_n)
   nns_edge_free (data);
 }
 
+/**
+ * @brief Util to check serialized data - invalid param.
+ */
+TEST(edgeDataIsSerialized, invalidParam01_n)
+{
+  int ret;
+
+  ret = nns_edge_data_is_serialized (NULL, 1U);
+  EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
+}
+
+/**
+ * @brief Util to check serialized data - invalid param.
+ */
+TEST(edgeDataIsSerialized, invalidParam02_n)
+{
+  void *data;
+  int ret;
+
+  data = nns_edge_malloc (100U);
+  ASSERT_TRUE (data != NULL);
+  memset (data, 0, 100U);
+
+  /* invalid data key */
+  ret = nns_edge_data_is_serialized (data, 100U);
+  EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
+
+  nns_edge_free (data);
+}
+
+/**
+ * @brief Util to check serialized data - invalid param.
+ */
+TEST(edgeDataIsSerialized, invalidParam03_n)
+{
+  nns_edge_data_h data_h;
+  void *data;
+  nns_size_t data_len;
+  int ret;
+
+  ret = nns_edge_data_create (&data_h);
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
+
+  ret = nns_edge_data_set_info (data_h, "temp-key", "temp-value");
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
+
+  ret = nns_edge_data_serialize (data_h, &data, &data_len);
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
+
+  /* invalid data size */
+  ret = nns_edge_data_is_serialized (data, 1U);
+  EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
+
+  ret = nns_edge_data_destroy (data_h);
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
+
+  nns_edge_free (data);
+}
+
 /**
  * @brief Create edge event - invalid param.
  */