Skip to content

Commit a1b8e99

Browse files
authored
Merge pull request #29 from axelkar/sahara-error
qdl: Handle errors in sahara_parse_packet()
2 parents 93b6584 + 0f558c1 commit a1b8e99

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

qdl/src/sahara.rs

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::{
1111
mem::{self, size_of_val},
1212
};
1313

14-
use anyhow::{Result, bail};
14+
use anyhow::{Result, anyhow, bail};
1515

1616
use bincode::serialize;
1717
use serde::{self, Deserialize, Serialize};
@@ -217,10 +217,6 @@ pub struct RamdumpTable64 {
217217
filename: [u8; 20],
218218
}
219219

220-
fn get_u32(buf: &[u8]) -> u32 {
221-
u32::from_le_bytes(buf.try_into().unwrap())
222-
}
223-
224220
pub fn sahara_send_img_to_device<T: Read + Write>(
225221
channel: &mut T,
226222
img_arr: &mut [Vec<u8>],
@@ -492,7 +488,7 @@ pub fn sahara_run<T: QdlChan>(
492488

493489
loop {
494490
let bytes_read = channel.read(&mut buf[..])?;
495-
let pkt = sahara_parse_packet(&buf[..bytes_read], verbose);
491+
let pkt = sahara_parse_packet(&buf[..bytes_read], verbose)?;
496492
let pktsize = size_of_val(&pkt.cmd) + size_of_val(&pkt.len);
497493

498494
match pkt.cmd {
@@ -599,54 +595,65 @@ pub fn sahara_run<T: QdlChan>(
599595
}
600596
}
601597

602-
fn sahara_parse_packet(buf: &[u8], verbose: bool) -> SaharaPacket {
603-
let cmd = bincode::deserialize::<SaharaCmd>(&buf[0..4])
604-
.unwrap_or_else(|_| panic!("Got unknown command {}", get_u32(&buf[0..4])));
598+
fn sahara_parse_packet(buf: &[u8], verbose: bool) -> Result<SaharaPacket> {
599+
let (cmd, rest) = buf
600+
.split_first_chunk::<4>()
601+
.ok_or_else(|| anyhow!("Malformed packet, too short: {buf:?}"))?;
602+
let (len, args) = rest
603+
.split_first_chunk::<4>()
604+
.ok_or_else(|| anyhow!("Malformed packet, too short: {buf:?}"))?;
605+
606+
let cmd = bincode::deserialize::<SaharaCmd>(cmd)
607+
.unwrap_or_else(|_| panic!("Got unknown command {}", u32::from_le_bytes(*cmd)));
605608

606609
let ret = SaharaPacket {
607610
cmd,
608-
len: get_u32(&buf[4..8]),
611+
len: u32::from_le_bytes(*len),
609612
body: match cmd {
610613
SaharaCmd::SaharaHello => {
611-
SaharaPacketBody::HelloReq(bincode::deserialize::<HelloReq>(&buf[8..]).unwrap())
614+
SaharaPacketBody::HelloReq(bincode::deserialize::<HelloReq>(args).unwrap())
612615
}
613616
SaharaCmd::SaharaHelloResp => {
614-
SaharaPacketBody::HelloResp(bincode::deserialize::<HelloResp>(&buf[8..]).unwrap())
617+
SaharaPacketBody::HelloResp(bincode::deserialize::<HelloResp>(args).unwrap())
615618
}
616619
SaharaCmd::SaharaReadData => {
617-
SaharaPacketBody::ReadReq(bincode::deserialize::<ReadReq>(&buf[8..]).unwrap())
620+
SaharaPacketBody::ReadReq(bincode::deserialize::<ReadReq>(args).unwrap())
618621
}
619622
SaharaCmd::SaharaEndOfImage => {
620-
SaharaPacketBody::Eoi(bincode::deserialize::<Eoi>(&buf[8..]).unwrap())
623+
SaharaPacketBody::Eoi(bincode::deserialize::<Eoi>(args).unwrap())
621624
}
622625
SaharaCmd::SaharaDone => SaharaPacketBody::DoneReq(DoneReq {}),
623626
SaharaCmd::SaharaDoneResp => {
624-
SaharaPacketBody::DoneResp(bincode::deserialize::<DoneResp>(&buf[8..]).unwrap())
627+
SaharaPacketBody::DoneResp(bincode::deserialize::<DoneResp>(args).unwrap())
625628
}
626629
SaharaCmd::SaharaResetResp => SaharaPacketBody::ResetResp(ResetResp {}),
627630
SaharaCmd::SaharaCommandReady => SaharaPacketBody::CommandReady(CommandReady {}),
628631
SaharaCmd::SaharaExecuteResp => {
629-
SaharaPacketBody::ExecResp(bincode::deserialize::<ExecResp>(&buf[8..]).unwrap())
632+
SaharaPacketBody::ExecResp(bincode::deserialize::<ExecResp>(args).unwrap())
633+
}
634+
SaharaCmd::SaharaExecuteData => {
635+
SaharaPacketBody::Command(bincode::deserialize::<SaharaCmdModeCmd>(args).unwrap())
630636
}
631-
SaharaCmd::SaharaExecuteData => SaharaPacketBody::Command(
632-
bincode::deserialize::<SaharaCmdModeCmd>(&buf[8..]).unwrap(),
633-
),
634637
SaharaCmd::SaharaMemDebug64 => {
635-
SaharaPacketBody::Debug64Req(bincode::deserialize::<Debug64Req>(&buf[8..]).unwrap())
638+
SaharaPacketBody::Debug64Req(bincode::deserialize::<Debug64Req>(args).unwrap())
639+
}
640+
SaharaCmd::SaharaMemRead64 => {
641+
SaharaPacketBody::ReadMem64Req(bincode::deserialize::<ReadMem64Req>(args).unwrap())
636642
}
637-
SaharaCmd::SaharaMemRead64 => SaharaPacketBody::ReadMem64Req(
638-
bincode::deserialize::<ReadMem64Req>(&buf[8..]).unwrap(),
639-
),
640643
SaharaCmd::SaharaReadData64 => SaharaPacketBody::ReadData64Req(
641-
bincode::deserialize::<ReadData64Req>(&buf[8..]).unwrap(),
644+
bincode::deserialize::<ReadData64Req>(args).unwrap(),
645+
),
646+
SaharaCmd::SaharaXML => bail!(
647+
"Got Firehose command while expecting Sahara command: {:?}",
648+
String::from_utf8_lossy(buf)
642649
),
643-
_ => todo!("Got unknown command: {:?}", buf),
650+
_ => bail!("Got unimplemented command: {:?}", buf),
644651
},
645652
};
646653

647654
if verbose {
648655
println!("{:?}", ret);
649656
}
650657

651-
ret
658+
Ok(ret)
652659
}

0 commit comments

Comments
 (0)