mqtt: parse properties with the right buffer's length

pull/6903/head
Philippe Antoine 4 years ago committed by Victor Julien
parent df2cbd6517
commit f0e869b26b

@ -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<Vec<MQ
}
// parse properties length
match parse_mqtt_variable_integer(input) {
Ok((rem, mut proplen)) => {
Ok((rem, proplen)) => {
if proplen == 0 {
// no properties
return Ok((rem, None));
}
// parse properties
let mut props = Vec::<MQTTProperty>::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),
}

Loading…
Cancel
Save