Skip to content

Commit 1439dec

Browse files
fix rpc decoding to reject extra data (#208)
* reject extra data * reduce diff
1 parent a9f1e99 commit 1439dec

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

src/rpc.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,7 @@ impl Request {
133133
let mut s = RlpStream::new();
134134
s.begin_list(2);
135135
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);
140137
buf.extend_from_slice(&s.out());
141138
buf
142139
}
@@ -307,8 +304,9 @@ impl Message {
307304
}
308305

309306
let msg_type = data[0];
307+
let data = &data[1..];
310308

311-
let rlp = rlp::Rlp::new(&data[1..]);
309+
let rlp = rlp::Rlp::new(data);
312310

313311
let list_len = rlp.item_count().and_then(|size| {
314312
if size < 2 {
@@ -318,6 +316,12 @@ impl Message {
318316
}
319317
})?;
320318

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+
321325
let id = RequestId::decode(rlp.val_at::<Vec<u8>>(0)?)?;
322326

323327
let message = match msg_type {
@@ -746,4 +750,23 @@ mod tests {
746750

747751
assert_eq!(request, decoded);
748752
}
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+
}
749772
}

0 commit comments

Comments
 (0)