]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
defrag: timeout check on look up; tag for removal
authorVictor Julien <vjulien@oisf.net>
Thu, 23 May 2024 19:11:23 +0000 (21:11 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 4 Jun 2024 04:28:26 +0000 (06:28 +0200)
src/defrag-hash.c
src/defrag-timeout.c
src/defrag-timeout.h

index 11fef806eaacd57f24a2021f7256c12f6312050c..2340826dab1fabf52b8faeb2a33c0fe5559dcfb6 100644 (file)
@@ -20,6 +20,7 @@
 #include "defrag-hash.h"
 #include "defrag-stack.h"
 #include "defrag-config.h"
+#include "defrag-timeout.h"
 #include "util-random.h"
 #include "util-byte.h"
 #include "util-misc.h"
@@ -557,14 +558,17 @@ DefragTracker *DefragGetTrackerFromHash(ThreadVars *tv, DecodeThreadVars *dtv, P
     dt = hb->head;
 
     do {
-        if (!dt->remove && DefragTrackerCompare(dt, p)) {
+        if (DefragTrackerTimedOut(dt, p->ts)) {
+            dt->remove = 1;
+        } else if (!dt->remove && DefragTrackerCompare(dt, p)) {
             /* found our tracker, lock & return */
             SCMutexLock(&dt->lock);
             (void)DefragTrackerIncrUsecnt(dt);
             DRLOCK_UNLOCK(hb);
             return dt;
+        }
 
-        } else if (dt->hnext == NULL) {
+        if (dt->hnext == NULL) {
             DefragTracker *prev = dt;
             dt = DefragTrackerGetNew(tv, dtv, p);
             if (dt == NULL) {
index dff754ea267a0720f24cea7e99680b3a50378265..ea9ca3c9b422f733cff41cd2a9fac5923c8ca77a 100644 (file)
@@ -36,7 +36,7 @@
  *  \retval 0 not timed out just yet
  *  \retval 1 fully timed out, lets kill it
  */
-static int DefragTrackerTimedOut(DefragTracker *dt, SCTime_t ts)
+int DefragTrackerTimedOut(DefragTracker *dt, SCTime_t ts)
 {
     /** never prune a trackers that is used by a packet
      *  we are currently processing in one of the threads */
index 6a24fc0f42a5aef5870e05f796d2e217ea78fa5f..38ff0248cf5a67c50c6c0738a130d0d0a768b41a 100644 (file)
@@ -24,6 +24,9 @@
 #ifndef SURICATA_DEFRAG_TIMEOUT_H
 #define SURICATA_DEFRAG_TIMEOUT_H
 
+#include "defrag.h"
+
+int DefragTrackerTimedOut(DefragTracker *dt, SCTime_t ts);
 uint32_t DefragTimeoutHash(SCTime_t ts);
 
 #endif