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 crate::mqtt::mqtt_property::*;
use nom7::bits::streaming::take as take_bits; use nom7::bits::streaming::take as take_bits;
use nom7::bytes::streaming::take_while_m_n; use nom7::bytes::streaming::take_while_m_n;
use nom7::bytes::complete::take;
use nom7::combinator::{complete, cond, verify}; use nom7::combinator::{complete, cond, verify};
use nom7::multi::{length_data, many0, many1}; use nom7::multi::{length_data, many0, many1};
use nom7::number::streaming::*; use nom7::number::streaming::*;
@ -105,26 +106,24 @@ fn parse_properties(input: &[u8], precond: bool) -> IResult<&[u8], Option<Vec<MQ
} }
// parse properties length // parse properties length
match parse_mqtt_variable_integer(input) { match parse_mqtt_variable_integer(input) {
Ok((rem, mut proplen)) => { Ok((rem, proplen)) => {
if proplen == 0 { if proplen == 0 {
// no properties // no properties
return Ok((rem, None)); return Ok((rem, None));
} }
// parse properties // parse properties
let mut props = Vec::<MQTTProperty>::new(); let mut props = Vec::<MQTTProperty>::new();
let mut newrem = rem; let (rem, mut newrem) = take(proplen as usize)(rem)?;
while proplen > 0 { while newrem.len() > 0 {
match parse_property(newrem) { match parse_property(newrem) {
Ok((rem, val)) => { Ok((rem2, val)) => {
props.push(val); props.push(val);
let curparselen = (newrem.len() - rem.len()) as u32; newrem = rem2;
proplen -= curparselen;
newrem = rem;
} }
Err(e) => return Err(e), Err(e) => return Err(e),
} }
} }
return Ok((newrem, Some(props))); return Ok((rem, Some(props)));
} }
Err(e) => return Err(e), Err(e) => return Err(e),
} }

Loading…
Cancel
Save