]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
mqtt: fix consumed bytes computation for truncated msg 7271/head
authorPhilippe Antoine <contact@catenacyber.fr>
Mon, 11 Apr 2022 19:29:33 +0000 (21:29 +0200)
committerVictor Julien <vjulien@oisf.net>
Tue, 19 Apr 2022 21:13:14 +0000 (23:13 +0200)
Ticket: 5268
(cherry picked from commit 3b13008c1b6b994df0ae3f702c24780fd253ec32)

rust/src/mqtt/mqtt.rs

index 737ec6beaf38ca9bea7a79aefed9b7a167c34c9d..797d9b1f4e5263d82fb3d04d886c9c965f7f0b8e 100644 (file)
@@ -432,7 +432,6 @@ impl MQTTState {
 
 
         while current.len() > 0 {
-            let mut skipped = false;
             SCLogDebug!("request: handling {}", current.len());
             match parse_message(current, self.protocol_version, self.max_msg_len) {
                 Ok((rem, msg)) => {
@@ -440,17 +439,18 @@ impl MQTTState {
                     if let MQTTOperation::TRUNCATED(ref trunc) = msg.op {
                         SCLogDebug!("found truncated with skipped {} current len {}", trunc.skipped_length, current.len());
                         if trunc.skipped_length >= current.len() {
-                            skipped = true;
                             self.skip_request = trunc.skipped_length - current.len();
+                            self.handle_msg(msg, true);
+                            return AppLayerResult::ok();
                         } else {
+                            consumed += trunc.skipped_length;
                             current = &current[trunc.skipped_length..];
+                            self.handle_msg(msg, true);
                             self.skip_request = 0;
+                            continue;
                         }
                     }
                     self.handle_msg(msg, false);
-                    if skipped {
-                        return AppLayerResult::ok();
-                    }
                     consumed += current.len() - rem.len();
                     current = rem;
                 }
@@ -489,7 +489,6 @@ impl MQTTState {
         }
 
         while current.len() > 0 {
-            let mut skipped = false;
             SCLogDebug!("response: handling {}", current.len());
             match parse_message(current, self.protocol_version, self.max_msg_len as usize) {
                 Ok((rem, msg)) => {
@@ -497,18 +496,19 @@ impl MQTTState {
                     if let MQTTOperation::TRUNCATED(ref trunc) = msg.op {
                         SCLogDebug!("found truncated with skipped {} current len {}", trunc.skipped_length, current.len());
                         if trunc.skipped_length >= current.len() {
-                            skipped = true;
                             self.skip_response = trunc.skipped_length - current.len();
+                            self.handle_msg(msg, true);
+                            SCLogDebug!("skip_response now {}", self.skip_response);
+                            return AppLayerResult::ok();
                         } else {
+                            consumed += trunc.skipped_length;
                             current = &current[trunc.skipped_length..];
+                            self.handle_msg(msg, true);
                             self.skip_response = 0;
+                            continue;
                         }
-                        SCLogDebug!("skip_response now {}", self.skip_response);
                     }
                     self.handle_msg(msg, true);
-                    if skipped {
-                        return AppLayerResult::ok();
-                    }
                     consumed += current.len() - rem.len();
                     current = rem;
                 }