Merge pull request 'add length check for CCSDS reader' (#213) from add-len-check-ccsds-reader into main

Reviewed-on: #213
This commit was merged in pull request #213.
This commit is contained in:
2026-05-19 16:10:41 +02:00
4 changed files with 25 additions and 18 deletions
Generated
+3 -10
View File
@@ -11,12 +11,6 @@ dependencies = [
"libc",
]
[[package]]
name = "arbitrary-int"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "825297538d77367557b912770ca3083f778a196054b3ee63b22673c4a3cae0a5"
[[package]]
name = "arbitrary-int"
version = "2.0.0"
@@ -44,11 +38,10 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "bitbybit"
version = "1.4.0"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec187a89ab07e209270175faf9e07ceb2755d984954e58a2296e325ddece2762"
checksum = "71d2a3353d70ac1091a33cbf31fc7e77b19091538a7e306e3740712af19807ca"
dependencies = [
"arbitrary-int 1.3.0",
"proc-macro2",
"quote",
"syn",
@@ -534,7 +527,7 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
name = "spacepackets"
version = "0.17.0"
dependencies = [
"arbitrary-int 2.0.0",
"arbitrary-int",
"bitbybit",
"chrono",
"crc",
-4
View File
@@ -57,10 +57,6 @@ use delegate::delegate;
use serde::{Deserialize, Serialize};
use zerocopy::{FromBytes, IntoBytes};
// Is necessary for some reason, possibly bug.
#[cfg(feature = "defmt")]
use arbitrary_int::traits::Integer;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
+21 -3
View File
@@ -690,8 +690,8 @@ impl SpacePacketHeader {
expected: CCSDS_HEADER_LEN,
});
}
// Unwrap okay, this can not fail.
let zc_header = zc::SpHeader::read_from_bytes(&buf[0..Self::LENGTH]).unwrap();
let zc_header = zc::SpHeader::read_from_bytes(&buf[0..Self::LENGTH])
.expect("zerocopy read failed unexpectedly");
Ok((Self::from(zc_header), &buf[Self::LENGTH..]))
}
@@ -1571,7 +1571,16 @@ impl<'buf> CcsdsPacketReader<'buf> {
buf: &'buf [u8],
checksum_type: Option<ChecksumType>,
) -> Result<Self, CcsdsPacketReadError> {
let sp_header = SpHeader::from_be_bytes(&buf[0..CCSDS_HEADER_LEN])?.0;
if buf.len() < CCSDS_HEADER_LEN {
return Err(ByteConversionError::FromSliceTooSmall {
found: buf.len(),
expected: CCSDS_HEADER_LEN,
}
.into());
}
let sp_header = SpHeader::from_be_bytes(&buf[0..CCSDS_HEADER_LEN])
.expect("SP header creation failed unexpectedly")
.0;
if sp_header.packet_len() > buf.len() {
return Err(ByteConversionError::FromSliceTooSmall {
found: buf.len(),
@@ -2354,6 +2363,15 @@ pub(crate) mod tests {
assert_eq!(buf[12], 0);
}
#[test]
fn test_ccsds_reader_fails_on_small_buf() {
let buf: [u8; 5] = [0; 5];
for size in 0..5 {
let reader = CcsdsPacketReader::new(&buf[0..size], None);
assert!(reader.is_err());
}
}
#[test]
fn test_ccsds_creator_creation_empty_user_data_no_checksum() {
let mut buf: [u8; 32] = [0; 32];
+1 -1
View File
@@ -312,7 +312,7 @@ impl PartialEq for PrimaryHeader {
/// USLP protocol ID (UPID) enumeration.
///
/// See https://sanaregistry.org/r/uslp_protocol_id/ for the source of this information.
/// See <https://sanaregistry.org/r/uslp_protocol_id/> for the source of this information.
#[derive(Debug, PartialEq, Eq, num_enum::TryFromPrimitive, num_enum::IntoPrimitive)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]