]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #5145: ftp_telnet: Improve performance in TelnetSplitter
authorAnkit Kumar (kuankit) <kuankit@cisco.com>
Thu, 19 Feb 2026 05:08:32 +0000 (05:08 +0000)
committerManjunatha Iyli (miyli) <miyli@cisco.com>
Thu, 19 Feb 2026 05:08:32 +0000 (05:08 +0000)
Merge in SNORT/snort3 from ~KUANKIT/snort3:fix/telnet-splitter-perf-bug to master

Squashed commit of the following:

commit df42809385a8275932915c81c3c163ec22fec66b
Author: kuankit <kuankit@cisco.com>
Date:   Thu Feb 5 02:09:17 2026 -0800

    ftp_telnet: improve performance in TelnetSplitter

src/service_inspectors/ftp_telnet/telnet_splitter.cc

index cced057576a80cb60bcee8b30c87b6b60e28092a..b53932e7bf03891e2bb4de116f93535f94355a2a 100644 (file)
@@ -68,28 +68,34 @@ StreamSplitter::Status TelnetSplitter::scan(
         {
             case TELNET_NONE:
             {
-                const uint8_t* cr = static_cast<const uint8_t*>(memchr(read_ptr, '\r', end - read_ptr));
-                const uint8_t* lf = static_cast<const uint8_t*>(memchr(read_ptr, '\n', end - read_ptr));
-                const uint8_t* ptr = nullptr;
-                if ( cr && !lf )
-                    ptr = cr;
-                else if ( !cr && lf )
-                    ptr = lf;
-                else if ( cr && lf )
-                    ptr = ( cr > lf ) ? cr : lf;
-
-                const uint8_t* iac_ptr = static_cast<const uint8_t*>(memchr( read_ptr, TNC_IAC, end - read_ptr));
-                if ( (ptr && iac_ptr && ptr < iac_ptr) || (ptr && !iac_ptr) )
+                const uint8_t* ptr = nullptr;      // last CR or LF found
+                const uint8_t* iac_ptr = nullptr;  // first IAC found
+
+                for ( const uint8_t* scan = read_ptr; scan < end; ++scan )
                 {
-                    fp_ptr = ptr;
-                    read_ptr = fp_ptr;
+                    uint8_t c = *scan;
+                    if ( c == '\r' || c == '\n' )
+                        ptr = scan;
+
+                    else if ( c == TNC_IAC )
+                    {
+                        iac_ptr = scan;
+                        break;
+                    }
                 }
 
+                if ( (ptr && iac_ptr && ptr < iac_ptr) || (ptr && !iac_ptr) )
+                    fp_ptr = ptr;
+
                 if ( iac_ptr )
                 {
                     state = TELNET_IAC;
                     read_ptr = iac_ptr;
                 }
+                else if ( ptr )
+                    read_ptr = ptr;
+                else
+                    read_ptr = end;
                 break;
             }
             case TELNET_IAC: