Remove panics on invalid chain parameter

This commit is contained in:
Sosthène Guédon
2023-06-19 08:45:53 +02:00
committed by sosthene-nitrokey
parent edb14da9b3
commit f2c2f7999b
2 changed files with 23 additions and 12 deletions
+13 -5
View File
@@ -281,7 +281,7 @@ where
State::Idle => {
// invariant: BUFFER_SIZE >= PACKET_SIZE
match command.chain() {
Chain::BeginsAndEnds => {
Ok(Chain::BeginsAndEnds) => {
info!("begins and ends");
self.reset_interchange();
let Some(message) = self.interchange.request_mut() else {
@@ -299,7 +299,7 @@ where
self.state = State::Processing;
// self.send_empty_datablock();
}
Chain::Begins => {
Ok(Chain::Begins) => {
info!("begins");
self.reset_interchange();
let Some(message) = self.interchange.request_mut() else {
@@ -316,6 +316,10 @@ where
self.state = State::Receiving;
self.send_empty_datablock(Chain::ExpectingMore);
}
Err(_) => {
error!("Unknown chain");
self.reset_state();
}
_ => {
error!("unexpectedly in idle state");
self.reset_state();
@@ -324,7 +328,7 @@ where
}
State::Receiving => match command.chain() {
Chain::Continues => {
Ok(Chain::Continues) => {
info!("continues");
let Some(message) = self.interchange.request_mut() else {
error!("Interchange is busy");
@@ -338,7 +342,7 @@ where
}
self.send_empty_datablock(Chain::ExpectingMore);
}
Chain::Ends => {
Ok(Chain::Ends) => {
info!("ends");
let Some(message) = self.interchange.request_mut() else {
error!("Interchange is busy");
@@ -353,6 +357,10 @@ where
self.call_app();
self.state = State::Processing;
}
Err(_) => {
error!("Unknown chain");
self.reset_state();
}
_ => {
error!("unexpectedly in receiving state");
self.reset_state();
@@ -368,7 +376,7 @@ where
}
State::Sending => match command.chain() {
Chain::ExpectingMore => {
Ok(Chain::ExpectingMore) => {
self.prime_outbox();
}
_chain => {
+10 -7
View File
@@ -61,17 +61,20 @@ pub trait PacketWithData: Packet {
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct UnknownChaining;
pub trait ChainedPacket: Packet {
#[inline(always)]
fn chain(&self) -> Chain {
fn chain(&self) -> Result<Chain, UnknownChaining> {
let level_parameter = u16::from_le_bytes(self[8..10].try_into().unwrap());
match level_parameter {
0 => Chain::BeginsAndEnds,
1 => Chain::Begins,
2 => Chain::Ends,
3 => Chain::Continues,
0x10 => Chain::ExpectingMore,
_ => panic!("invalid power select parameter"),
0 => Ok(Chain::BeginsAndEnds),
1 => Ok(Chain::Begins),
2 => Ok(Chain::Ends),
3 => Ok(Chain::Continues),
0x10 => Ok(Chain::ExpectingMore),
_ => Err(UnknownChaining),
}
}
}