From 56a4d00a45b297fe5ea461607426dbf95f3868ff Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Fri, 28 Aug 2026 16:54:59 -0700 Subject: [PATCH] tls_codec: return an error instead of panicking on truncated VLBytes Signed-off-by: Asriel Camora --- tls_codec/src/quic_vec.rs | 12 ------------ tls_codec/tests/decode_bytes.rs | 25 ++++++++++++++++++++++++- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/tls_codec/src/quic_vec.rs b/tls_codec/src/quic_vec.rs index a94d9b74a..7fa08b3a9 100644 --- a/tls_codec/src/quic_vec.rs +++ b/tls_codec/src/quic_vec.rs @@ -366,12 +366,6 @@ impl DeserializeBytes for VLBytes { Ok(vec) => Ok((Self { vec: vec.to_vec() }, &remainder[length..])), Err(_e) => { let remaining_len = remainder.len(); - if !cfg!(fuzzing) { - debug_assert_eq!( - remaining_len, length, - "Expected to read {length} bytes but {remaining_len} were read.", - ); - } Err(Error::DecodingError(format!( "{remaining_len} bytes were read but {length} were expected", ))) @@ -465,12 +459,6 @@ impl DeserializeBytes for VLByteVec { Ok(vec) => Ok((Self { vec: vec.to_vec() }, &remainder[length..])), Err(_e) => { let remaining_len = remainder.len(); - if !cfg!(fuzzing) { - debug_assert_eq!( - remaining_len, length, - "Expected to read {length} bytes but {remaining_len} were read.", - ); - } Err(Error::DecodingError(format!( "{remaining_len} bytes were read but {length} were expected", ))) diff --git a/tls_codec/tests/decode_bytes.rs b/tls_codec/tests/decode_bytes.rs index f16c2e320..ec06e77be 100644 --- a/tls_codec/tests/decode_bytes.rs +++ b/tls_codec/tests/decode_bytes.rs @@ -1,6 +1,7 @@ +#![cfg_attr(feature = "future_deprecations", allow(deprecated))] use tls_codec::{ DeserializeBytes, Error, Size, TlsByteVecU8, TlsByteVecU16, TlsByteVecU24, TlsByteVecU32, - TlsVecU8, + TlsVecU8, VLByteVec, VLBytes, }; #[test] @@ -196,6 +197,28 @@ fn truncated_byte_vec_reports_end_of_stream() { ); } +// Length 4 + 2 content bytes +#[test] +fn truncated_vlbytes_reports_decoding_error() { + let input = [4u8, 0xAA, 0xBB]; + let res = VLBytes::tls_deserialize_bytes(&input); + assert!( + matches!(res, Err(Error::DecodingError(_))), + "expected DecodingError, got {res:?}" + ); +} + +// Same input, but for `VLByteVec` +#[test] +fn truncated_vlbytevec_reports_decoding_error() { + let input = [4u8, 0xAA, 0xBB]; + let res = VLByteVec::tls_deserialize_bytes(&input); + assert!( + matches!(res, Err(Error::DecodingError(_))), + "expected DecodingError, got {res:?}" + ); +} + // The length-summing overflow/saturation branches only exist on non-64-bit // targets (on 64-bit, lengths are bounded by `isize::MAX` and can't overflow // `usize`). This test therefore only compiles and runs on 32-bit — e.g. the