]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
defrag: improve thread safety in config logging
authorVictor Julien <vjulien@oisf.net>
Thu, 19 Jun 2025 10:52:32 +0000 (12:52 +0200)
committerVictor Julien <victor@inliniac.net>
Sat, 21 Jun 2025 19:32:54 +0000 (21:32 +0200)
CID 1554235: (#1 of 1): Data race condition (MISSING_LOCK)
missing_lock: Accessing defragtracker_spare_q.len without holding lock DefragTrackerStack_.m. Elsewhere, DefragTrackerStack_.len is written to with DefragTrackerStack_.m held 2 out of 2 times.

src/defrag-hash.c
src/defrag-stack.c
src/defrag-stack.h

index 2f1e4e832f6e719fc60e160360ac7c3727a0f4f6..98921b80217ec8ffd978cb4605f4c056f404ae90 100644 (file)
@@ -275,7 +275,8 @@ void DefragInitConfig(bool quiet)
             }
             if (!quiet) {
                 SCLogConfig("preallocated %" PRIu32 " defrag trackers of size %" PRIuMAX "",
-                        defragtracker_spare_q.len, (uintmax_t)sizeof(DefragTracker));
+                        DefragTrackerStackSize(&defragtracker_spare_q),
+                        (uintmax_t)sizeof(DefragTracker));
             }
         }
     }
index 22d5776df960cd9933b048317c3e74908306c0a4..987e3c81f1972b7be3bc9984fa3593338d6e275f 100644 (file)
@@ -98,3 +98,15 @@ DefragTracker *DefragTrackerDequeue(DefragTrackerStack *q)
     DQLOCK_UNLOCK(q);
     return dt;
 }
+
+/**
+ *  \brief return stack size
+ */
+uint32_t DefragTrackerStackSize(DefragTrackerStack *q)
+{
+    uint32_t len;
+    DQLOCK_LOCK(q);
+    len = q->len;
+    DQLOCK_UNLOCK(q);
+    return len;
+}
index 99bb1268148833faebdb3808e2f6c27f3fd1a3e6..7ed657a6f8cc0b68fabb01611e57b25aac5c718b 100644 (file)
@@ -75,5 +75,6 @@ void DefragTrackerStackDestroy(DefragTrackerStack *);
 
 void DefragTrackerEnqueue(DefragTrackerStack *, DefragTracker *);
 DefragTracker *DefragTrackerDequeue(DefragTrackerStack *);
+uint32_t DefragTrackerStackSize(DefragTrackerStack *q);
 
 #endif /* SURICATA_DEFRAG_QUEUE_H */