diff --git a/rust/src/mqtt/parser.rs b/rust/src/mqtt/parser.rs index 8e6900ef4e..d252290733 100644 --- a/rust/src/mqtt/parser.rs +++ b/rust/src/mqtt/parser.rs @@ -22,6 +22,7 @@ use crate::mqtt::mqtt_message::*; use crate::mqtt::mqtt_property::*; use nom7::bits::streaming::take as take_bits; use nom7::bytes::streaming::take_while_m_n; +use nom7::bytes::complete::take; use nom7::combinator::{complete, cond, verify}; use nom7::multi::{length_data, many0, many1}; use nom7::number::streaming::*; @@ -105,26 +106,24 @@ fn parse_properties(input: &[u8], precond: bool) -> IResult<&[u8], Option { + Ok((rem, proplen)) => { if proplen == 0 { // no properties return Ok((rem, None)); } // parse properties let mut props = Vec::::new(); - let mut newrem = rem; - while proplen > 0 { + let (rem, mut newrem) = take(proplen as usize)(rem)?; + while newrem.len() > 0 { match parse_property(newrem) { - Ok((rem, val)) => { + Ok((rem2, val)) => { props.push(val); - let curparselen = (newrem.len() - rem.len()) as u32; - proplen -= curparselen; - newrem = rem; + newrem = rem2; } Err(e) => return Err(e), } } - return Ok((newrem, Some(props))); + return Ok((rem, Some(props))); } Err(e) => return Err(e), }