]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #823 in SNORT/snort3 from free_the_gids-vjr to master
authorRuss Combs (rucombs) <rucombs@cisco.com>
Wed, 22 Feb 2017 21:41:55 +0000 (16:41 -0500)
committerRuss Combs (rucombs) <rucombs@cisco.com>
Wed, 22 Feb 2017 21:41:55 +0000 (16:41 -0500)
Squashed commit of the following:

commit 9403cbcdf2a16ec768325102b7a4e97e79f0a740
Author: Victor Roemer <viroemer@cisco.com>
Date:   Tue Feb 21 15:09:38 2017 -0500

    Only emplace non-zero gids

commit 2db5bc3e5222e927828446294de1394303773972
Author: Victor Roemer <viroemer@cisco.com>
Date:   Mon Feb 20 11:42:49 2017 -0500

    Keep track of GID's in use.

commit 99636e1116c862d0f0d5b73c0042c6de0c62c340
Author: Russ Combs <rucombs@cisco.com>
Date:   Wed Feb 15 11:05:51 2017 -0500

    poc - allow arbitrary gid use; test and perf tbd

src/managers/module_manager.cc
src/managers/module_manager.h
src/parser/parse_rule.cc

index 1b52a60c020c206c2a2427c340d98bf538a7d718..cbc4307d897d6b09dbc83984dd471675c82545c9 100644 (file)
@@ -63,6 +63,8 @@ typedef std::list<ModHook*> ModuleList;
 static ModuleList s_modules;
 static unsigned s_errors = 0;
 
+std::set<uint32_t> ModuleManager::gids;
+
 static string s_current;
 static string s_name;
 static string s_type;
@@ -793,6 +795,9 @@ void ModuleManager::add_module(Module* m, const BaseApi* b)
 
     std::lock_guard<std::mutex> lock(stats_mutex);
     m->reset_stats();
+
+    if ( m->get_gid() )
+        gids.emplace(m->get_gid());
 }
 
 Module* ModuleManager::get_module(const char* s)
@@ -1054,6 +1059,11 @@ void ModuleManager::show_commands(const char* pfx, bool exact)
         cout << "no match" << endl;
 }
 
+bool ModuleManager::gid_in_use(uint32_t gid)
+{
+    return gids.find(gid) != gids.end();
+}
+
 void ModuleManager::show_gids(const char* pfx, bool exact)
 {
     s_modules.sort(comp_gids);
index bd91df93816767efd107c05384a708c588cb54be..2ca570391dcec3efb3c458f4ceb918f4e653ee45 100644 (file)
@@ -23,6 +23,8 @@
 // Factory for Modules, including all builtin and plugin modules.
 // Modules are strictly used during parse time.
 
+#include <cstdint>
+#include <set>
 #include <list>
 
 //-------------------------------------------------------------------------
@@ -46,6 +48,8 @@ public:
     static void show_modules();
     static void show_module(const char*);
 
+    static bool gid_in_use(uint32_t);
+
     // output for matching module name; prefix is sufficient if not exact
     static void show_configs(const char* = nullptr, bool exact = false);
     static void show_commands(const char* = nullptr, bool exact = false);
@@ -66,6 +70,8 @@ public:
     static void dump_stats(SnortConfig*, const char* skip = nullptr);
     static void accumulate(SnortConfig*);
     static void reset_stats(SnortConfig*);
+
+    static std::set<uint32_t> gids;
 };
 
 #endif
index ea4ed0449d4add2658bb7a540633ea35c17a035d..87de0a0c11c979b066d0f47737b663a1fc0d5dcb 100644 (file)
@@ -33,6 +33,7 @@
 #include "main/snort_debug.h"
 #include "main/thread_config.h"
 #include "managers/ips_manager.h"
+#include "managers/module_manager.h"
 #include "managers/so_manager.h"
 #include "ports/rule_port_tables.h"
 #include "sfip/sf_ipvar.h"
@@ -1263,11 +1264,8 @@ const char* parse_rule_close(SnortConfig* sc, RuleTreeNode& rtn, OptTreeNode* ot
         otn->sigInfo.text_rule = true;
         so_rule_count++;
     }
-    else
+    else if ( ModuleManager::gid_in_use(otn->sigInfo.generator) )
     {
-        if ( !otn->sigInfo.generator )
-            ParseError("gid must set in builtin rules");
-
         if ( otn->num_detection_opts )
             ParseError("%u:%u builtin rules do not support detection options",
                 otn->sigInfo.generator, otn->sigInfo.id);