11//! Module containing the default implementation of data frames.
2- use std:: io:: { Read , Write } ;
2+ use std:: io:: { self , Read , Write } ;
33use result:: { WebSocketResult , WebSocketError } ;
44use ws:: dataframe:: DataFrame as DataFrameable ;
55use ws:: util:: header:: DataFrameHeader ;
@@ -61,7 +61,6 @@ impl DataFrame {
6161 if !should_be_masked {
6262 return Err ( WebSocketError :: DataFrameError ( "Expected unmasked data frame" ) ) ;
6363 }
64- // TODO: move data to avoid copy?
6564 mask:: mask_data ( mask, & body)
6665 }
6766 None => {
@@ -87,7 +86,10 @@ impl DataFrame {
8786 let header = try!( dfh:: read_header ( reader) ) ;
8887
8988 let mut data: Vec < u8 > = Vec :: with_capacity ( header. len as usize ) ;
90- reader. take ( header. len ) . read_to_end ( & mut data) ?;
89+ let read = reader. take ( header. len ) . read_to_end ( & mut data) ?;
90+ if ( read as u64 ) < header. len {
91+ return Err ( io:: Error :: new ( io:: ErrorKind :: UnexpectedEof , "incomplete payload" ) . into ( ) ) ;
92+ }
9193
9294 DataFrame :: read_dataframe_body ( header, data, should_be_masked)
9395 }
@@ -212,6 +214,25 @@ mod tests {
212214 } ;
213215 assert_eq ! ( obtained, expected) ;
214216 }
217+
218+ #[ test]
219+ fn read_incomplete_payloads ( ) {
220+ let mut data = vec ! [ 0x8au8 , 0x08 , 0x19 , 0xac , 0xab , 0x8a , 0x52 , 0x4e , 0x05 , 0x00 ] ;
221+ let payload = vec ! [ 25 , 172 , 171 , 138 , 82 , 78 , 5 , 0 ] ;
222+ let short_header = DataFrame :: read_dataframe ( & mut & data[ ..1 ] , false ) ;
223+ let short_payload = DataFrame :: read_dataframe ( & mut & data[ ..6 ] , false ) ;
224+ let full_payload = DataFrame :: read_dataframe ( & mut & data[ ..] , false ) ;
225+ data. push ( 0xff ) ;
226+ let more_payload = DataFrame :: read_dataframe ( & mut & data[ ..] , false ) ;
227+
228+ match ( short_header. unwrap_err ( ) , short_payload. unwrap_err ( ) ) {
229+ ( WebSocketError :: NoDataAvailable , WebSocketError :: NoDataAvailable ) => ( ) ,
230+ _ => assert ! ( false ) ,
231+ } ;
232+ assert_eq ! ( full_payload. unwrap( ) . data, payload) ;
233+ assert_eq ! ( more_payload. unwrap( ) . data, payload) ;
234+ }
235+
215236 #[ bench]
216237 fn bench_read_dataframe ( b : & mut Bencher ) {
217238 let data = b"The quick brown fox jumps over the lazy dog" ;
0 commit comments