@@ -44,17 +44,22 @@ impl<T: AsRef<[u8]>> Packet<T> {
44
44
45
45
/// Ensure that no accessor method will panic if called.
46
46
/// Returns `Err(Error::Truncated)` if the buffer is too short.
47
+ /// Returns `Err(Error::Malformed)` if the length field has a value smaller
48
+ /// than the header length.
47
49
///
48
- /// The result of this check is invalidated by calling [set_header_len ].
50
+ /// The result of this check is invalidated by calling [set_len ].
49
51
///
50
- /// [set_header_len ]: #method.set_header_len
52
+ /// [set_len ]: #method.set_len
51
53
pub fn check_len ( & self ) -> Result < ( ) , Error > {
52
- let len = self . buffer . as_ref ( ) . len ( ) ;
53
- if len < field:: CHECKSUM . end {
54
+ let buffer_len = self . buffer . as_ref ( ) . len ( ) ;
55
+ if buffer_len < field:: CHECKSUM . end {
54
56
Err ( Error :: Truncated )
55
57
} else {
56
- if len < self . len ( ) as usize {
58
+ let field_len = self . len ( ) as usize ;
59
+ if buffer_len < field_len {
57
60
Err ( Error :: Truncated )
61
+ } else if field_len < field:: CHECKSUM . end {
62
+ Err ( Error :: Malformed )
58
63
} else {
59
64
Ok ( ( ) )
60
65
}
@@ -299,6 +304,14 @@ mod test {
299
304
assert_eq ! ( & packet. into_inner( ) [ ..] , & PACKET_BYTES [ ..] ) ;
300
305
}
301
306
307
+ #[ test]
308
+ fn test_impossible_len ( ) {
309
+ let mut bytes = vec ! [ 0 ; 12 ] ;
310
+ let mut packet = Packet :: new ( & mut bytes) ;
311
+ packet. set_len ( 4 ) ;
312
+ assert_eq ! ( packet. check_len( ) , Err ( Error :: Malformed ) ) ;
313
+ }
314
+
302
315
fn packet_repr ( ) -> Repr < ' static > {
303
316
Repr {
304
317
src_port : 48896 ,
0 commit comments