mirror of
https://github.com/trussed-dev/usbd-ccid.git
synced 2026-06-20 04:16:20 -07:00
Remove panics on invalid chain parameter
This commit is contained in:
committed by
sosthene-nitrokey
parent
edb14da9b3
commit
f2c2f7999b
+13
-5
@@ -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
@@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user