|
1 | 1 | //! Module containing the default implementation of data frames.
|
2 |
| -use std::io::{Read, Write}; |
| 2 | +use std::io::{self, Read, Write}; |
3 | 3 | use result::{WebSocketResult, WebSocketError};
|
4 | 4 | use ws::dataframe::DataFrame as DataFrameable;
|
5 | 5 | use ws::util::header::DataFrameHeader;
|
@@ -87,7 +87,10 @@ impl DataFrame {
|
87 | 87 | let header = try!(dfh::read_header(reader));
|
88 | 88 |
|
89 | 89 | 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 | + } |
91 | 94 |
|
92 | 95 | DataFrame::read_dataframe_body(header, data, should_be_masked)
|
93 | 96 | }
|
@@ -212,6 +215,25 @@ mod tests {
|
212 | 215 | };
|
213 | 216 | assert_eq!(obtained, expected);
|
214 | 217 | }
|
| 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 | + |
215 | 237 | #[bench]
|
216 | 238 | fn bench_read_dataframe(b: &mut Bencher) {
|
217 | 239 | let data = b"The quick brown fox jumps over the lazy dog";
|
|
0 commit comments