From 0bc21eec486075e5e83a29e21e0d0c51a5f07de5 Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Mon, 28 Apr 2025 21:29:51 +0200 Subject: [PATCH] datajson: fix thread safety violation --- src/datajson.c | 17 ++++++++++++----- src/datajson.h | 3 +++ src/detect-dataset.c | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/datajson.c b/src/datajson.c index f8d1fc7f58..ba2be9f20b 100644 --- a/src/datajson.c +++ b/src/datajson.c @@ -44,6 +44,13 @@ static inline void DatajsonUnlockData(THashData *d) THashDataUnlock(d); } +void DatajsonUnlockElt(DataJsonResultType *r) +{ + if (r->hashdata) { + DatajsonUnlockData(r->hashdata); + } +} + /* return true if number is a float or an integer */ static bool IsFloat(const char *in, size_t ins) { @@ -786,7 +793,7 @@ static DataJsonResultType DatajsonLookupString( StringType *found = rdata->data; rrep.found = true; rrep.json = found->json; - DatajsonUnlockData(rdata); + rrep.hashdata = rdata; return rrep; } return rrep; @@ -810,7 +817,7 @@ static DataJsonResultType DatajsonLookupMd5( Md5Type *found = rdata->data; rrep.found = true; rrep.json = found->json; - DatajsonUnlockData(rdata); + rrep.hashdata = rdata; return rrep; } return rrep; @@ -834,7 +841,7 @@ static DataJsonResultType DatajsonLookupSha256( Sha256Type *found = rdata->data; rrep.found = true; rrep.json = found->json; - DatajsonUnlockData(rdata); + rrep.hashdata = rdata; return rrep; } return rrep; @@ -858,7 +865,7 @@ static DataJsonResultType DatajsonLookupIPv4( IPv4Type *found = rdata->data; rrep.found = true; rrep.json = found->json; - DatajsonUnlockData(rdata); + rrep.hashdata = rdata; return rrep; } return rrep; @@ -883,7 +890,7 @@ static DataJsonResultType DatajsonLookupIPv6( IPv6Type *found = rdata->data; rrep.found = true; rrep.json = found->json; - DatajsonUnlockData(rdata); + rrep.hashdata = rdata; return rrep; } return rrep; diff --git a/src/datajson.h b/src/datajson.h index 710485cc1f..9871b11005 100644 --- a/src/datajson.h +++ b/src/datajson.h @@ -37,6 +37,7 @@ typedef struct DataJsonType { typedef struct DataJsonResultType { bool found; DataJsonType json; + THashData *hashdata; } DataJsonResultType; /* Common functions */ @@ -49,4 +50,6 @@ DataJsonResultType DatajsonLookup(Dataset *set, const uint8_t *data, const uint3 int DatajsonAddSerialized(Dataset *set, const char *value, const char *json); +void DatajsonUnlockElt(DataJsonResultType *r); + #endif /* SURICATA_DATAJSON_H*/ diff --git a/src/detect-dataset.c b/src/detect-dataset.c index 1485c4b2e0..623b8c119d 100644 --- a/src/detect-dataset.c +++ b/src/detect-dataset.c @@ -89,6 +89,7 @@ static int DetectDatajsonBufferMatch(DetectEngineThreadCtx *det_ctx, const Detec det_ctx->json_content[det_ctx->json_content_len].id = sd->id; det_ctx->json_content_len++; } + DatajsonUnlockElt(&r); } return 1; }