]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
parameter: add int_list
authorruss <rucombs@cisco.com>
Fri, 15 Jul 2022 16:11:27 +0000 (12:11 -0400)
committerRuss Combs (rucombs) <rucombs@cisco.com>
Sat, 13 Aug 2022 18:39:07 +0000 (18:39 +0000)
src/framework/parameter.cc
src/framework/parameter.h

index 8cee32450e85274fa8e40c9a5999ad749d8b8a12..2358d75225be3e24ce15c35e3d96cdbcf41f287f 100644 (file)
@@ -386,6 +386,32 @@ static bool valid_bit_list(Value& v, const char* r)
     return true;
 }
 
+static bool valid_int_list(Value& v, const char* r)
+{
+    if ( v.get_type() != Value::VT_STR )
+        return false;
+
+    string pl = v.get_string();
+
+    size_t max = r ? strtoul(r, nullptr, 0) : 0;
+    assert(max < ULONG_MAX);
+
+    stringstream ss(pl);
+    ss >> setbase(0);
+
+    int val;
+
+    while ( ss >> val )
+    {
+        if ( val < 0 || (r and (size_t)val > max) )
+            return false;
+    }
+    if ( !ss.eof() )
+        return false;
+
+    return true;
+}
+
 //--------------------------------------------------------------------------
 // Parameter methods
 //--------------------------------------------------------------------------
@@ -434,7 +460,13 @@ bool Parameter::validate(Value& v) const
     case PT_BIT_LIST:
         return valid_bit_list(v, (const char*)range);
 
+    case PT_INT_LIST:
+        return valid_int_list(v, (const char*)range);
+
     case PT_ADDR_LIST:
+        // validated by user on sfip_from_string
+        // fall through
+
     case PT_IMPLIED:
         return true;
 
@@ -450,7 +482,7 @@ static const char* const pt2str[Parameter::PT_MAX] =
     "bool", "int", "interval", "real", "port",
     "string", "select", "multi", "enum",
     "mac", "ip4", "addr",
-    "bit_list", "addr_list", "implied"
+    "bit_list", "int_list", "addr_list", "implied"
 };
 
 const char* Parameter::get_type() const
@@ -675,6 +707,13 @@ string_tests[] =
     { false, valid_bit_list, "1 2 3 4", "3" },
     { false, valid_bit_list, "128", "3" },
 
+    { true, valid_int_list, "0 65535", nullptr },
+    { true, valid_int_list, "0 65535", "65535" },
+    { false, valid_int_list, "-1", "1" },
+    { false, valid_int_list, "65535", "1" },
+    { false, valid_int_list, "1", "0" },
+    { true, valid_int_list, "0", "0" },
+
     { false, nullptr, nullptr, nullptr }
 // __STRDUMP_ENABLE__
 };
index 8131b398852818bee534d21b732a863fd0a2b3f2..f94c05553e14c9e429af353d7b083b858236cf27 100644 (file)
@@ -58,7 +58,8 @@ struct SO_PUBLIC Parameter
         PT_IP4,        // inet_addr() compatible
         PT_ADDR,       // ip4 or ip6 CIDR
         PT_BIT_LIST,   // string that converts to bitset
-        PT_ADDR_LIST,  // snort address list format?
+        PT_INT_LIST,   // string that contains ints
+        PT_ADDR_LIST,  // Snort 2 ip list in [ ]
         PT_IMPLIED,    // rule option args w/o values eg relative
         PT_MAX
     };