From: Philippe Antoine Date: Mon, 11 Apr 2022 19:29:33 +0000 (+0200) Subject: mqtt: fix consumed bytes computation for truncated msg X-Git-Tag: suricata-6.0.5~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3a6d150340169b47ed45b157fc948a1fb9c6c53;p=thirdparty%2Fsuricata.git mqtt: fix consumed bytes computation for truncated msg Ticket: 5268 (cherry picked from commit 3b13008c1b6b994df0ae3f702c24780fd253ec32) --- diff --git a/rust/src/mqtt/mqtt.rs b/rust/src/mqtt/mqtt.rs index 737ec6beaf..797d9b1f4e 100644 --- a/rust/src/mqtt/mqtt.rs +++ b/rust/src/mqtt/mqtt.rs @@ -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 = ¤t[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 = ¤t[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; }