Skip to content

Commit accae7a

Browse files
committed
Dataframe must read entire payload.
1 parent f2c9e8f commit accae7a

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/dataframe.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! Module containing the default implementation of data frames.
2-
use std::io::{Read, Write};
2+
use std::io::{self, Read, Write};
33
use result::{WebSocketResult, WebSocketError};
44
use ws::dataframe::DataFrame as DataFrameable;
55
use ws::util::header::DataFrameHeader;
@@ -87,7 +87,10 @@ impl DataFrame {
8787
let header = try!(dfh::read_header(reader));
8888

8989
let mut data: Vec<u8> = Vec::with_capacity(header.len as usize);
90-
reader.take(header.len).read_to_end(&mut data)?;
90+
let read = reader.take(header.len).read_to_end(&mut data)?;
91+
if (read as u64) < header.len {
92+
return Err(io::Error::new(io::ErrorKind::UnexpectedEof, "incomplete payload").into());
93+
}
9194

9295
DataFrame::read_dataframe_body(header, data, should_be_masked)
9396
}
@@ -212,6 +215,25 @@ mod tests {
212215
};
213216
assert_eq!(obtained, expected);
214217
}
218+
219+
#[test]
220+
fn read_incomplete_payloads() {
221+
let mut data = vec![0x8au8, 0x08, 0x19, 0xac, 0xab, 0x8a, 0x52, 0x4e, 0x05, 0x00];
222+
let payload = vec![25, 172, 171, 138, 82, 78, 5, 0];
223+
let short_header = DataFrame::read_dataframe(&mut &data[..1], false);
224+
let short_payload = DataFrame::read_dataframe(&mut &data[..6], false);
225+
let full_payload = DataFrame::read_dataframe(&mut &data[..], false);
226+
data.push(0xff);
227+
let more_payload = DataFrame::read_dataframe(&mut &data[..], false);
228+
229+
match (short_header.unwrap_err(), short_payload.unwrap_err()) {
230+
(WebSocketError::NoDataAvailable, WebSocketError::NoDataAvailable) => (),
231+
_ => assert!(false),
232+
};
233+
assert_eq!(full_payload.unwrap().data, payload);
234+
assert_eq!(more_payload.unwrap().data, payload);
235+
}
236+
215237
#[bench]
216238
fn bench_read_dataframe(b: &mut Bencher) {
217239
let data = b"The quick brown fox jumps over the lazy dog";

0 commit comments

Comments
 (0)