static int DatajsonAddString(
Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
{
- if (set == NULL)
- return -1;
-
StringType lookup = { .ptr = (uint8_t *)data, .len = data_len, .json = *json };
struct THashDataGetResult res = THashGetFromHash(set->hash, &lookup);
if (res.data) {
static int DatajsonAddMd5(
Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
{
- if (set == NULL)
- return -1;
-
if (data_len != SC_MD5_LEN)
return -2;
static int DatajsonAddSha256(
Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
{
- if (set == NULL)
- return -1;
-
if (data_len != SC_SHA256_LEN)
return -2;
static int DatajsonAddIPv4(
Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
{
- if (set == NULL)
- return -1;
-
if (data_len < SC_IPV4_LEN)
return -2;
static int DatajsonAddIPv6(
Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
{
- if (set == NULL)
- return -1;
-
if (data_len != SC_IPV6_LEN)
return -2;
return -1;
}
+/*
+ * \brief Add data to the dataset from a JSON object.
+ *
+ * \param set The dataset to add data to.
+ * \param data The data to add.
+ * \param data_len The length of the data.
+ * \param json The JSON object containing additional information.
+ *
+ * Memory allocated for the `json` parameter will be freed if the data
+ * is not added to the hash.
+ *
+ * \retval 1 Data was added to the hash.
+ * \retval 0 Data was not added to the hash as it is already there.
+ * \retval -1 Failed to add data to the hash.
+ */
static int DatajsonAdd(
Dataset *set, const uint8_t *data, const uint32_t data_len, DataJsonType *json)
{
- if (set == NULL)
+ if (json == NULL)
+ return -1;
+ if (json->value == NULL)
return -1;
+ if (set == NULL) {
+ if (json->value != NULL) {
+ SCFree(json->value);
+ json->value = NULL;
+ }
+ return -1;
+ }
+
+ int add_ret = 0;
switch (set->type) {
case DATASET_TYPE_STRING:
- return DatajsonAddString(set, data, data_len, json);
+ add_ret = DatajsonAddString(set, data, data_len, json);
+ break;
case DATASET_TYPE_MD5:
- return DatajsonAddMd5(set, data, data_len, json);
+ add_ret = DatajsonAddMd5(set, data, data_len, json);
+ break;
case DATASET_TYPE_SHA256:
- return DatajsonAddSha256(set, data, data_len, json);
+ add_ret = DatajsonAddSha256(set, data, data_len, json);
+ break;
case DATASET_TYPE_IPV4:
- return DatajsonAddIPv4(set, data, data_len, json);
+ add_ret = DatajsonAddIPv4(set, data, data_len, json);
+ break;
case DATASET_TYPE_IPV6:
- return DatajsonAddIPv6(set, data, data_len, json);
+ add_ret = DatajsonAddIPv6(set, data, data_len, json);
+ break;
default:
+ add_ret = -1;
break;
}
- return -1;
+
+ if (add_ret == 1) {
+ return 1;
+ }
+
+ if (json->value != NULL) {
+ SCFree(json->value);
+ json->value = NULL;
+ }
+ return add_ret;
}
static int DatajsonLoadTypeFromJSON(Dataset *set, char *json_key, char *array_key,
int add_ret = DatajsonAdd(set, (const uint8_t *)val, strlen(val), &elt);
if (add_ret < 0) {
FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
- SCFree(elt.value);
return 0;
}
- if (add_ret == 0) {
- SCFree(elt.value);
- } else {
- return 1;
- }
-
- return 0;
+ return add_ret;
}
static int DatajsonLoadString(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
int add_ret = DatajsonAdd(set, (const uint8_t *)hash, SC_MD5_LEN, &elt);
if (add_ret < 0) {
FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
- SCFree(elt.value);
return 0;
}
- if (add_ret == 0) {
- SCFree(elt.value);
- } else {
- return 1;
- }
-
- return 0;
+ return add_ret;
}
static int DatajsonLoadMd5(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
int add_ret = DatajsonAdd(set, (const uint8_t *)hash, SC_SHA256_LEN, &elt);
if (add_ret < 0) {
FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
- SCFree(elt.value);
return 0;
}
- if (add_ret == 0) {
- SCFree(elt.value);
- } else {
- return 1;
- }
-
- return 0;
+ return add_ret;
}
static int DatajsonLoadSha256(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
int add_ret = DatajsonAdd(set, (const uint8_t *)&in.s_addr, SC_IPV4_LEN, &elt);
if (add_ret < 0) {
FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
- SCFree(elt.value);
return 0;
}
- if (add_ret == 0) {
- SCFree(elt.value);
- } else {
- return 1;
- }
-
- return 0;
+ return add_ret;
}
static int DatajsonLoadIPv4(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
int add_ret = DatajsonAdd(set, (const uint8_t *)&in6.s6_addr, SC_IPV6_LEN, &elt);
if (add_ret < 0) {
FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
- SCFree(elt.value);
return 0;
}
- if (add_ret == 0) {
- SCFree(elt.value);
- } else {
- return 1;
- }
-
- return 0;
+ return add_ret;
}
static int DatajsonLoadIPv6(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
*/
int DatajsonAddSerialized(Dataset *set, const char *value, const char *json)
{
- int ret;
-
if (set == NULL)
return -1;
+
if (strlen(value) == 0)
return -1;
(const uint8_t *)value, strlen(value), SCBase64ModeStrict, decoded);
if (num_decoded == 0)
goto operror;
- ret = DatajsonAdd(set, decoded, num_decoded, &jvalue);
- if (ret <= 0) {
- SCFree(jvalue.value);
- }
- return ret;
+ return DatajsonAdd(set, decoded, num_decoded, &jvalue);
}
case DATASET_TYPE_MD5: {
if (strlen(value) != SC_MD5_HEX_LEN)
uint8_t hash[SC_MD5_LEN];
if (HexToRaw((const uint8_t *)value, SC_MD5_HEX_LEN, hash, sizeof(hash)) < 0)
goto operror;
- ret = DatajsonAdd(set, hash, SC_MD5_LEN, &jvalue);
- if (ret <= 0) {
- SCFree(jvalue.value);
- }
- return ret;
+ return DatajsonAdd(set, hash, SC_MD5_LEN, &jvalue);
}
case DATASET_TYPE_SHA256: {
if (strlen(value) != SC_SHA256_HEX_LEN)
uint8_t hash[SC_SHA256_LEN];
if (HexToRaw((const uint8_t *)value, SC_SHA256_HEX_LEN, hash, sizeof(hash)) < 0)
goto operror;
- ret = DatajsonAdd(set, hash, SC_SHA256_LEN, &jvalue);
- if (ret <= 0) {
- SCFree(jvalue.value);
- }
- return ret;
+ return DatajsonAdd(set, hash, SC_SHA256_LEN, &jvalue);
}
case DATASET_TYPE_IPV4: {
struct in_addr in;
if (inet_pton(AF_INET, value, &in) != 1)
goto operror;
- ret = DatajsonAdd(set, (uint8_t *)&in.s_addr, SC_IPV4_LEN, &jvalue);
- if (ret <= 0) {
- SCFree(jvalue.value);
- }
- return ret;
+ return DatajsonAdd(set, (uint8_t *)&in.s_addr, SC_IPV4_LEN, &jvalue);
}
case DATASET_TYPE_IPV6: {
struct in6_addr in6;
SCLogError("Dataset failed to import %s as IPv6", value);
goto operror;
}
- ret = DatajsonAdd(set, (uint8_t *)&in6.s6_addr, SC_IPV6_LEN, &jvalue);
- if (ret <= 0) {
- SCFree(jvalue.value);
- }
- return ret;
+ return DatajsonAdd(set, (uint8_t *)&in6.s6_addr, SC_IPV6_LEN, &jvalue);
}
}
SCFree(jvalue.value);