]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #3591: Content retry fix
authorOleksii Shumeiko -X (oshumeik - SOFTSERVE INC at Cisco) <oshumeik@cisco.com>
Thu, 22 Sep 2022 14:34:44 +0000 (14:34 +0000)
committerOleksii Shumeiko -X (oshumeik - SOFTSERVE INC at Cisco) <oshumeik@cisco.com>
Thu, 22 Sep 2022 14:34:44 +0000 (14:34 +0000)
Merge in SNORT/snort3 from ~VHORBATO/snort3:content_retry_fix to master

Squashed commit of the following:

commit 2c16faf29f2f400e1439a46ad9e533cf99dc46c7
Author: Vitalii <vhorbato@cisco.com>
Date:   Thu Sep 15 19:03:29 2022 +0300

    parser: remove platform dependency from parse_int function

commit 906ae2b9be21e7c1bc6916da9bac2dfddfb443b1
Author: Andrii Serbeniuk <aserbeni@cisco.com>
Date:   Wed Sep 21 10:51:59 2022 +0300

    ips_options: rollback changes causing content not to match when out of data start boundary

src/ips_options/ips_content.cc
src/parser/parse_utils.cc

index 2083d659f8b42ad0312d9914c9ef0339205b0f86..acd2e19e46b21d737c04ab4115e9323c96202150 100644 (file)
@@ -306,8 +306,18 @@ static int uniSearchReal(ContentData* cd, Cursor& c)
     int64_t pos;
 
     if ( !c.get_delta() )
+    {
         // first - adjust from cursor or buffer start
         pos = (cd->pmd.is_relative() ? c.get_pos() : 0) + offset;
+
+        if ( pos < 0 )
+        {
+            if ( depth )
+                depth += pos;
+
+            pos = 0;
+        }
+    }
     else
     {
         // retry - adjust from start of last match
index b06650ff9c12a7325249226ad3db485143c79e2e..6508e67be13590ad0d383d79d948848a0b7c8a06 100644 (file)
@@ -24,6 +24,7 @@
 #include "parse_utils.h"
 
 #include <cassert>
+#include <climits>
 #include <cstring>
 
 #include "log/messages.h"
@@ -125,7 +126,9 @@ bool parse_byte_code(const char* in, bool& negate, std::string& out)
 
 int parse_int(const char* data, const char* tag, int low, int high)
 {
-    int32_t value = 0;
+    assert(low <= high);
+
+    long value = 0;
     char* endptr = nullptr;
 
     value = SnortStrtol(data, &endptr, 10);
@@ -133,22 +136,24 @@ int parse_int(const char* data, const char* tag, int low, int high)
     if (*endptr)
     {
         ParseError("invalid '%s' format.", tag);
-        return value;
+        return (int)value;
     }
 
-    if (errno == ERANGE)
+    if (errno == ERANGE || value > INT_MAX || value < INT_MIN)
     {
         ParseError("range problem on '%s' value.", tag);
-        return value;
+        errno = ERANGE;
     }
-
-    if ((value > high) || (value < low))
+    else if ((value > high) || (value < low))
     {
         ParseError("'%s' must be in %d:%d, inclusive", tag, low, high);
-        return value;
     }
 
-    return value;
+    if (value > high)
+        return high;
+    else if (value < low)
+        return low;
+    return (int)value;
 }
 
 //--------------------------------------------------------------------------
@@ -183,7 +188,7 @@ TEST_CASE("parse_int", "[ParseUtils]")
 
         int res = parse_int(data, "test");
 
-        CHECK(res == -1);
+        CHECK(res == 65535);
         CHECK(errno == ERANGE);
     }
 
@@ -193,7 +198,7 @@ TEST_CASE("parse_int", "[ParseUtils]")
 
         int res = parse_int(data, "test");
 
-        CHECK(res == 0);
+        CHECK(res == -65535);
         CHECK(errno == ERANGE);
     }
 
@@ -201,14 +206,14 @@ TEST_CASE("parse_int", "[ParseUtils]")
     {
         int res = parse_int("1", "test", 2, 3);
 
-        CHECK(res == 1);
+        CHECK(res == 2);
     }
 
     SECTION("above the limit")
     {
         int res = parse_int("4", "test", 2, 3);
 
-        CHECK(res == 4);
+        CHECK(res == 3);
     }
 }