]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
datasets: factorize serialised operations
authorEric Leblond <eric@regit.org>
Tue, 19 Jan 2021 21:00:54 +0000 (22:00 +0100)
committerVictor Julien <vjulien@oisf.net>
Thu, 27 Oct 2022 07:44:20 +0000 (09:44 +0200)
Ticket: #5184

src/datasets.c

index 8d84affbf1eb33a38f7132f681d83a9c3efc1beb..88308ed9cf096cdb0ea852ccfbf6e0ba5048c2ce 100644 (file)
@@ -1134,13 +1134,10 @@ static int DatasetAddwRep(Dataset *set, const uint8_t *data, const uint32_t data
     return -1;
 }
 
-/** \brief add serialized data to set
- *  \retval int 1 added
- *  \retval int 0 already in hash
- *  \retval int -1 API error (not added)
- *  \retval int -2 DATA error
- */
-int DatasetAddSerialized(Dataset *set, const char *string)
+typedef int (*DatasetOpFunc)(Dataset *set, const uint8_t *data, const uint32_t data_len);
+
+static int DatasetOpSerialized(Dataset *set, const char *string, DatasetOpFunc DatasetOpString,
+        DatasetOpFunc DatasetOpMd5, DatasetOpFunc DatasetOpSha256)
 {
     if (set == NULL)
         return -1;
@@ -1156,7 +1153,7 @@ int DatasetAddSerialized(Dataset *set, const char *string)
                 return -2;
             }
 
-            return DatasetAddString(set, decoded, num_decoded);
+            return DatasetOpString(set, decoded, num_decoded);
         }
         case DATASET_TYPE_MD5: {
             if (strlen(string) != 32)
@@ -1164,7 +1161,7 @@ int DatasetAddSerialized(Dataset *set, const char *string)
             uint8_t hash[16];
             if (HexToRaw((const uint8_t *)string, 32, hash, sizeof(hash)) < 0)
                 return -2;
-            return DatasetAddMd5(set, hash, 16);
+            return DatasetOpMd5(set, hash, 16);
         }
         case DATASET_TYPE_SHA256: {
             if (strlen(string) != 64)
@@ -1172,7 +1169,7 @@ int DatasetAddSerialized(Dataset *set, const char *string)
             uint8_t hash[32];
             if (HexToRaw((const uint8_t *)string, 64, hash, sizeof(hash)) < 0)
                 return -2;
-            return DatasetAddSha256(set, hash, 32);
+            return DatasetOpSha256(set, hash, 32);
         }
     }
     return -1;
@@ -1184,40 +1181,21 @@ int DatasetAddSerialized(Dataset *set, const char *string)
  *  \retval int -1 API error (not added)
  *  \retval int -2 DATA error
  */
-int DatasetLookupSerialized(Dataset *set, const char *string)
+int DatasetAddSerialized(Dataset *set, const char *string)
 {
-    if (set == NULL)
-        return -1;
+    return DatasetOpSerialized(set, string, DatasetAddString, DatasetAddMd5, DatasetAddSha256);
+}
 
-    switch (set->type) {
-        case DATASET_TYPE_STRING: {
-            // coverity[alloc_strlen : FALSE]
-            uint8_t decoded[strlen(string)];
-            uint32_t consumed = 0, num_decoded = 0;
-            Base64Ecode code = DecodeBase64(decoded, strlen(string), (const uint8_t *)string,
-                    strlen(string), &consumed, &num_decoded, BASE64_MODE_STRICT);
-            if (code == BASE64_ECODE_ERR)
-                FatalError(SC_ERR_FATAL, "bad base64 encoding %s/%s", set->name, set->load);
-            return DatasetLookup(set, decoded, num_decoded);
-        }
-        case DATASET_TYPE_MD5: {
-            if (strlen(string) != 32)
-                return -2;
-            uint8_t hash[16];
-            if (HexToRaw((const uint8_t *)string, 32, hash, sizeof(hash)) < 0)
-                return -2;
-            return DatasetLookup(set, hash, 16);
-        }
-        case DATASET_TYPE_SHA256: {
-            if (strlen(string) != 64)
-                return -2;
-            uint8_t hash[32];
-            if (HexToRaw((const uint8_t *)string, 64, hash, sizeof(hash)) < 0)
-                return -2;
-            return DatasetLookup(set, hash, 32);
-        }
-    }
-    return -1;
+/** \brief add serialized data to set
+ *  \retval int 1 added
+ *  \retval int 0 already in hash
+ *  \retval int -1 API error (not added)
+ *  \retval int -2 DATA error
+ */
+int DatasetLookupSerialized(Dataset *set, const char *string)
+{
+    return DatasetOpSerialized(
+            set, string, DatasetLookupString, DatasetLookupMd5, DatasetLookupSha256);
 }
 
 /**
@@ -1268,38 +1246,6 @@ static int DatasetRemoveSha256(Dataset *set, const uint8_t *data, const uint32_t
  *  \retval int -2 DATA error */
 int DatasetRemoveSerialized(Dataset *set, const char *string)
 {
-    if (set == NULL)
-        return -1;
-
-    switch (set->type) {
-        case DATASET_TYPE_STRING: {
-            // coverity[alloc_strlen : FALSE]
-            uint8_t decoded[strlen(string)];
-            uint32_t consumed = 0, num_decoded = 0;
-            Base64Ecode code = DecodeBase64(decoded, strlen(string), (const uint8_t *)string,
-                    strlen(string), &consumed, &num_decoded, BASE64_MODE_STRICT);
-            if (code == BASE64_ECODE_ERR) {
-                return -2;
-            }
-
-            return DatasetRemoveString(set, decoded, num_decoded);
-        }
-        case DATASET_TYPE_MD5: {
-            if (strlen(string) != 32)
-                return -2;
-            uint8_t hash[16];
-            if (HexToRaw((const uint8_t *)string, 32, hash, sizeof(hash)) < 0)
-                return -2;
-            return DatasetRemoveMd5(set, hash, 16);
-        }
-        case DATASET_TYPE_SHA256: {
-            if (strlen(string) != 64)
-                return -2;
-            uint8_t hash[32];
-            if (HexToRaw((const uint8_t *)string, 64, hash, sizeof(hash)) < 0)
-                return -2;
-            return DatasetRemoveSha256(set, hash, 32);
-        }
-    }
-    return -1;
+    return DatasetOpSerialized(
+            set, string, DatasetRemoveString, DatasetRemoveMd5, DatasetRemoveSha256);
 }