@@ -133,10 +133,7 @@ impl Request {
133
133
let mut s = RlpStream :: new ( ) ;
134
134
s. begin_list ( 2 ) ;
135
135
s. append ( & id. as_bytes ( ) ) ;
136
- s. begin_list ( distances. len ( ) ) ;
137
- for distance in distances {
138
- s. append ( & distance) ;
139
- }
136
+ s. append_list ( & distances) ;
140
137
buf. extend_from_slice ( & s. out ( ) ) ;
141
138
buf
142
139
}
@@ -307,8 +304,9 @@ impl Message {
307
304
}
308
305
309
306
let msg_type = data[ 0 ] ;
307
+ let data = & data[ 1 ..] ;
310
308
311
- let rlp = rlp:: Rlp :: new ( & data[ 1 .. ] ) ;
309
+ let rlp = rlp:: Rlp :: new ( data) ;
312
310
313
311
let list_len = rlp. item_count ( ) . and_then ( |size| {
314
312
if size < 2 {
@@ -318,6 +316,12 @@ impl Message {
318
316
}
319
317
} ) ?;
320
318
319
+ // verify there is no extra data
320
+ let payload_info = rlp. payload_info ( ) ?;
321
+ if data. len ( ) != payload_info. header_len + payload_info. value_len {
322
+ return Err ( DecoderError :: RlpInconsistentLengthAndData ) ;
323
+ }
324
+
321
325
let id = RequestId :: decode ( rlp. val_at :: < Vec < u8 > > ( 0 ) ?) ?;
322
326
323
327
let message = match msg_type {
@@ -746,4 +750,23 @@ mod tests {
746
750
747
751
assert_eq ! ( request, decoded) ;
748
752
}
753
+
754
+ #[ test]
755
+ fn reject_extra_data ( ) {
756
+ let data = [ 6 , 194 , 0 , 75 ] ;
757
+ let msg = Message :: decode ( & data) . unwrap ( ) ;
758
+ assert_eq ! (
759
+ msg,
760
+ Message :: Response ( Response {
761
+ id: RequestId ( vec![ 0 ] ) ,
762
+ body: ResponseBody :: Talk { response: vec![ 75 ] }
763
+ } )
764
+ ) ;
765
+
766
+ let data2 = [ 6 , 193 , 0 , 75 , 252 ] ;
767
+ Message :: decode ( & data2) . expect_err ( "should reject extra data" ) ;
768
+
769
+ let data3 = [ 6 , 194 , 0 , 75 , 252 ] ;
770
+ Message :: decode ( & data3) . expect_err ( "should reject extra data" ) ;
771
+ }
749
772
}
0 commit comments