]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
bug 2113: unix-socket start up race 2714/head
authorVictor Julien <victor@inliniac.net>
Tue, 16 May 2017 07:39:02 +0000 (09:39 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 16 May 2017 07:53:29 +0000 (09:53 +0200)
src/runmode-unix-socket.c
src/runmode-unix-socket.h
src/unix-manager.c
src/unix-manager.h

index 8b7276cd4faefd3e57be43590f594c5e92537234..93494de12377e7393ddc32e26b8873c0d8918156 100644 (file)
@@ -67,6 +67,7 @@ const char *RunModeUnixSocketGetDefaultMode(void)
 
 #ifdef BUILD_UNIX_SOCKET
 
+static int RunModeUnixSocketSingle(void);
 static int unix_manager_file_task_running = 0;
 static int unix_manager_file_task_failed = 0;
 
@@ -1007,14 +1008,17 @@ TmEcode UnixSocketHostbitList(json_t *cmd, json_t* answer, void *data_unused)
 }
 #endif /* BUILD_UNIX_SOCKET */
 
+#ifdef BUILD_UNIX_SOCKET
 /**
  * \brief Single thread version of the Pcap file processing.
  */
-int RunModeUnixSocketSingle(void)
+static int RunModeUnixSocketSingle(void)
 {
-#ifdef BUILD_UNIX_SOCKET
     PcapCommand *pcapcmd = SCMalloc(sizeof(PcapCommand));
 
+    if (UnixManagerInit() != 0)
+        return 1;
+
     if (unlikely(pcapcmd == NULL)) {
         SCLogError(SC_ERR_MEM_ALLOC, "Can not allocate pcap command");
         return 1;
@@ -1023,20 +1027,19 @@ int RunModeUnixSocketSingle(void)
     pcapcmd->running = 0;
     pcapcmd->currentfile = NULL;
 
-    UnixManagerThreadSpawn(1);
-
-    unix_socket_mode_is_running = 1;
-
     UnixManagerRegisterCommand("pcap-file", UnixSocketAddPcapFile, pcapcmd, UNIX_CMD_TAKE_ARGS);
     UnixManagerRegisterCommand("pcap-file-number", UnixSocketPcapFilesNumber, pcapcmd, 0);
     UnixManagerRegisterCommand("pcap-file-list", UnixSocketPcapFilesList, pcapcmd, 0);
     UnixManagerRegisterCommand("pcap-current", UnixSocketPcapCurrent, pcapcmd, 0);
 
     UnixManagerRegisterBackgroundTask(UnixSocketPcapFilesCheck, pcapcmd);
-#endif
+
+    UnixManagerThreadSpawn(1);
+    unix_socket_mode_is_running = 1;
 
     return 0;
 }
+#endif
 
 int RunModeUnixSocketIsActive(void)
 {
index 78ef53626514db01890575ef00158556b314ff9b..91de1c254fdb1cb4d2789bf7265bdc36b8ee552f 100644 (file)
@@ -23,7 +23,6 @@
 #ifndef __RUNMODE_UNIX_SOCKET_H__
 #define __RUNMODE_UNIX_SOCKET_H__
 
-int RunModeUnixSocketSingle(void);
 void RunModeUnixSocketRegister(void);
 const char *RunModeUnixSocketGetDefaultMode(void);
 
index 2f942d895cb4329d402802d7ae6b404912efad25..7bc5ae4d0446bf5d2a113ec15a741545f3f1c8ff 100644 (file)
@@ -846,22 +846,13 @@ TmEcode UnixManagerRegisterBackgroundTask(TmEcode (*Func)(void *),
     SCReturnInt(TM_ECODE_OK);
 }
 
-typedef struct UnixManagerThreadData_ {
-    int padding;
-} UnixManagerThreadData;
-
-static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void **data)
+int UnixManagerInit(void)
 {
-    UnixManagerThreadData *utd = SCCalloc(1, sizeof(*utd));
-    if (utd == NULL)
-        return TM_ECODE_FAILED;
-
     if (UnixNew(&command) == 0) {
         int failure_fatal = 0;
         if (ConfGetBool("engine.init-failure-fatal", &failure_fatal) != 1) {
             SCLogDebug("ConfGetBool could not load the value.");
         }
-        SCFree(utd);
         if (failure_fatal) {
             SCLogError(SC_ERR_INITIALIZATION,
                     "Unable to create unix command socket");
@@ -869,7 +860,7 @@ static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void *
         } else {
             SCLogWarning(SC_ERR_INITIALIZATION,
                     "Unable to create unix command socket");
-            return TM_ECODE_FAILED;
+            return -1;
         }
     }
 
@@ -893,6 +884,19 @@ static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void *
     UnixManagerRegisterCommand("remove-hostbit", UnixSocketHostbitRemove, &command, UNIX_CMD_TAKE_ARGS);
     UnixManagerRegisterCommand("list-hostbit", UnixSocketHostbitList, &command, UNIX_CMD_TAKE_ARGS);
 
+    return 0;
+}
+
+typedef struct UnixManagerThreadData_ {
+    int padding;
+} UnixManagerThreadData;
+
+static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void **data)
+{
+    UnixManagerThreadData *utd = SCCalloc(1, sizeof(*utd));
+    if (utd == NULL)
+        return TM_ECODE_FAILED;
+
     *data = utd;
     return TM_ECODE_OK;
 }
index 5ec3c889e3480b53abfdb931d59ba9f855b0b623..5270d91ed17ffa2e6e23cb6dc5a6636225805a76 100644 (file)
@@ -33,6 +33,7 @@
 SCCtrlCondT unix_manager_ctrl_cond;
 SCCtrlMutex unix_manager_ctrl_mutex;
 
+int UnixManagerInit(void);
 void UnixManagerThreadSpawn(int mode);
 void UnixSocketKillSocketThread(void);