]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
mqtt: fix consumed bytes computation for truncated msg 7253/head
authorPhilippe Antoine <contact@catenacyber.fr>
Mon, 11 Apr 2022 19:29:33 +0000 (21:29 +0200)
committerVictor Julien <vjulien@oisf.net>
Mon, 18 Apr 2022 12:45:48 +0000 (14:45 +0200)
Ticket: 5268

rust/src/mqtt/mqtt.rs

index 0881efa8737adf190da1d67484a3dff3c142b89d..2644612800a2bd5ed4c15d1e4df299c3a8be7b4a 100644 (file)
@@ -438,7 +438,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)) => {
@@ -450,17 +449,18 @@ impl MQTTState {
                             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;
                 }
@@ -512,7 +512,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)) => {
@@ -524,18 +523,19 @@ impl MQTTState {
                             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;
                 }