1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +02:00

handle malformed utf8 in names and cvars

This commit is contained in:
Robin Appelman 2019-05-25 23:53:44 +02:00
commit d12cf35e47
9 changed files with 41 additions and 13 deletions

View file

@ -130,11 +130,3 @@ pub struct CmdKeyValuesMessage {
}
impl BitSkip<LittleEndian> for CmdKeyValuesMessage{}
#[derive(BitRead, Debug)]
pub struct SetConVarMessage {
#[size_bits = 8]
vars: HashMap<String, String>,
}
impl BitSkip<LittleEndian> for SetConVarMessage{}

View file

@ -14,6 +14,7 @@ use crate::demo::message::stringtable::*;
use crate::demo::message::tempentities::*;
use crate::demo::message::usermessage::*;
use crate::demo::message::voice::*;
use crate::demo::message::setconvar::*;
use crate::demo::parser::ParseBitSkip;
pub mod bspdecal;
@ -25,6 +26,7 @@ pub mod stringtable;
pub mod tempentities;
pub mod usermessage;
pub mod voice;
pub mod setconvar;
#[derive(Primitive, Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
#[repr(u8)]

View file

@ -0,0 +1,27 @@
use bitstream_reader::{BitRead, BitReadSized, LittleEndian, BitSkip};
use crate::demo::message::stringtable::log_base2;
use crate::{ReadResult, Stream};
#[derive(Debug)]
pub struct SetConVarMessage {
vars: Vec<(String, String)>,
}
impl BitRead<LittleEndian> for SetConVarMessage {
fn read(stream: &mut Stream) -> ReadResult<Self> {
let count: u8 = stream.read()?;
let mut vars: Vec<(String, String)> = Vec::with_capacity(count as usize);
for _ in 0..count {
let key = stream.read().unwrap_or_else(|_| "Malformed cvar name".to_string());
let value = stream.read().unwrap_or_else(|_| "Malformed cvar value".to_string());
vars.push((key, value));
}
Ok(SetConVarMessage {
vars
})
}
}
impl BitSkip<LittleEndian> for SetConVarMessage {}

View file

@ -268,7 +268,7 @@ impl Analyser {
}
fn parse_user_info(&mut self, text: &String, mut data: Stream) -> ReadResult<()> {
let name: String = data.read_sized(32)?;
let name: String = data.read_sized(32).unwrap_or("Malformed Name".into());
let user_id = UserId((data.read::<u32>()? & 255) as u8);
let steam_id: String = data.read()?;
let entity_id: Option<u32> = text.parse().ok();