]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
flow-worker: clean up thread init
authorVictor Julien <victor@inliniac.net>
Thu, 16 Feb 2017 15:41:06 +0000 (16:41 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 17 Feb 2017 11:36:19 +0000 (12:36 +0100)
src/flow-worker.c

index 84ac31c7be3c667f685d661ceba233fb9862f610..ac0bd484ddacdf03473d7cebaceaa1e961965dbe 100644 (file)
@@ -80,35 +80,45 @@ static inline TmEcode FlowUpdate(Packet *p)
     }
 }
 
+static TmEcode FlowWorkerThreadDeinit(ThreadVars *tv, void *data);
+
 static TmEcode FlowWorkerThreadInit(ThreadVars *tv, void *initdata, void **data)
 {
     FlowWorkerThreadData *fw = SCCalloc(1, sizeof(*fw));
-    BUG_ON(fw == NULL);
+    if (fw == NULL)
+        return TM_ECODE_FAILED;
+
     SC_ATOMIC_INIT(fw->detect_thread);
     SC_ATOMIC_SET(fw->detect_thread, NULL);
 
     fw->dtv = DecodeThreadVarsAlloc(tv);
     if (fw->dtv == NULL) {
-        SC_ATOMIC_DESTROY(fw->detect_thread);
-        SCFree(fw);
+        FlowWorkerThreadDeinit(tv, fw);
         return TM_ECODE_FAILED;
     }
 
     /* setup TCP */
-    BUG_ON(StreamTcpThreadInit(tv, NULL, &fw->stream_thread_ptr) != TM_ECODE_OK);
+    if (StreamTcpThreadInit(tv, NULL, &fw->stream_thread_ptr) != TM_ECODE_OK) {
+        FlowWorkerThreadDeinit(tv, fw);
+        return TM_ECODE_FAILED;
+    }
 
     if (DetectEngineEnabled()) {
         /* setup DETECT */
         void *detect_thread = NULL;
-        BUG_ON(DetectEngineThreadCtxInit(tv, NULL, &detect_thread) != TM_ECODE_OK);
+        if (DetectEngineThreadCtxInit(tv, NULL, &detect_thread) != TM_ECODE_OK) {
+            FlowWorkerThreadDeinit(tv, fw);
+            return TM_ECODE_FAILED;
+        }
         SC_ATOMIC_SET(fw->detect_thread, detect_thread);
     }
 
     /* Setup outputs for this thread. */
     if (OutputLoggerThreadInit(tv, initdata, &fw->output_thread) != TM_ECODE_OK) {
+        FlowWorkerThreadDeinit(tv, fw);
         return TM_ECODE_FAILED;
     }
+
     AppLayerRegisterThreadCounters(tv);
 
     /* setup pq for stream end pkts */
@@ -142,6 +152,7 @@ static TmEcode FlowWorkerThreadDeinit(ThreadVars *tv, void *data)
     BUG_ON(fw->pq.len);
     SCMutexDestroy(&fw->pq.mutex_q);
 
+    SC_ATOMIC_DESTROY(fw->detect_thread);
     SCFree(fw);
     return TM_ECODE_OK;
 }