From 4f8131b18976d70e62f99e6b50e9d3c716e1ff31 Mon Sep 17 00:00:00 2001 From: Victoria Fischer Date: Fri, 2 Jan 2026 15:56:28 +0100 Subject: [PATCH] tasks: simulation: better handle certain errors --- src/simdata.rs | 3 ++- src/tasks/simulation.rs | 38 ++++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/simdata.rs b/src/simdata.rs index 77e61cf..0e3e7d1 100644 --- a/src/simdata.rs +++ b/src/simdata.rs @@ -18,7 +18,8 @@ pub enum SimDataError { DecodeError(E), EndOfStream, UnsupportedStreamType(ExtMeta), - EventHeaderMissing + EventHeaderMissing, + PartitionNotFound } impl From for SimDataError { diff --git a/src/tasks/simulation.rs b/src/tasks/simulation.rs index 9638cb9..27f5052 100644 --- a/src/tasks/simulation.rs +++ b/src/tasks/simulation.rs @@ -67,7 +67,7 @@ impl SimDataTable where S::Error: core::fmt::Debug + info!("Searching for sim data partition"); let data_partition = partitions.iter().find(|partition| { partition.partition_type() == partition_type && partition.label_as_str() == "sim" - }).expect("Unable to locate 'sim' data partition!"); + }).ok_or(SimDataError::PartitionNotFound)?; let start = data_partition.offset() as usize; let end = data_partition.len() as usize + start; @@ -97,11 +97,18 @@ impl Iterator for SimDataTable whe loop { match StreamHeader::from_rmp(&mut self.reader) { Ok(header) => { - let sensor_reader = self.reader.subset(header.size as usize); - self.reader.seek(header.size as usize); - self.index += 1; - debug!("Found header={header:?}"); - return Some(SimDataReader::open(sensor_reader, header.id)); + match self.reader.subset(header.size) { + Ok(sensor_reader) => { + self.reader.seek(header.size); + self.index += 1; + debug!("Found header={header:?}"); + return Some(SimDataReader::open(sensor_reader, header.id)); + }, + err => { + error!("Read error while opening simulation stream {err:?}"); + return None; + } + } }, Err(SimDataError::UnsupportedStreamType(meta)) => { error!("Found unknown simulation data chunk {meta:?}"); @@ -109,7 +116,7 @@ impl Iterator for SimDataTable whe self.index += 1; } Err(err) => { - error!("Read error while decoding simulation data {err:?}"); + error!("Read error while decoding simulation stream table {err:?}"); return None; } } @@ -142,14 +149,17 @@ impl RangeReader { self.offset += offset; } - pub fn subset(&self, size: usize) -> Self where S: Clone + core::fmt::Debug { + pub fn subset(&self, size: usize) -> Result> where S: Clone + core::fmt::Debug { trace!("subset {:#02x}:{:#02x} -> {:#02x}:{:#02x}", self.start, self.end, self.start + self.offset, self.start + self.offset + size); - assert!(self.start + self.offset + size < self.end); - Self { - storage: self.storage.clone(), - start: self.offset + self.start, - end: self.start + self.offset + size, - offset: 0 + if self.start + self.offset + size < self.end { + Err(SimDataError::EndOfStream) + } else { + Ok(Self { + storage: self.storage.clone(), + start: self.offset + self.start, + end: self.start + self.offset + size, + offset: 0 + }) } } }