@@ -27,15 +27,15 @@ use tokio::io::AsyncRead;
2727use tokio:: io:: AsyncWrite ;
2828
2929pub enum Fragment {
30- Text ( Option < utf8:: Incomplete > , Vec < u8 > ) ,
30+ Text ( Option < utf8:: Incomplete > , Vec < u8 > , usize ) ,
3131 Binary ( Vec < u8 > ) ,
3232}
3333
3434impl Fragment {
3535 /// Returns the payload of the fragment.
3636 fn take_buffer ( self ) -> Vec < u8 > {
3737 match self {
38- Fragment :: Text ( _, buffer) => buffer,
38+ Fragment :: Text ( _, buffer, _ ) => buffer,
3939 Fragment :: Binary ( buffer) => buffer,
4040 }
4141 }
@@ -118,7 +118,10 @@ impl<'f, S> FragmentCollector<S> {
118118 if is_closed && frame. opcode != OpCode :: Close {
119119 return Err ( WebSocketError :: ConnectionClosed ) ;
120120 }
121- if let Some ( frame) = self . fragments . accumulate ( frame) ? {
121+ if let Some ( frame) = self
122+ . fragments
123+ . accumulate ( frame, self . read_half . max_message_size ) ?
124+ {
122125 return Ok ( frame) ;
123126 }
124127 }
@@ -191,7 +194,10 @@ impl<'f, S> FragmentCollectorRead<S> {
191194 let Some ( frame) = res? else {
192195 continue ;
193196 } ;
194- if let Some ( frame) = self . fragments . accumulate ( frame) ? {
197+ if let Some ( frame) = self
198+ . fragments
199+ . accumulate ( frame, self . read_half . max_message_size ) ?
200+ {
195201 return Ok ( frame) ;
196202 }
197203 }
@@ -215,6 +221,7 @@ impl Fragments {
215221 pub fn accumulate < ' f > (
216222 & mut self ,
217223 frame : Frame < ' f > ,
224+ max_message_size : usize ,
218225 ) -> Result < Option < Frame < ' f > > , WebSocketError > {
219226 match frame. opcode {
220227 OpCode :: Text | OpCode :: Binary => {
@@ -224,15 +231,23 @@ impl Fragments {
224231 }
225232 return Ok ( Some ( Frame :: new ( true , frame. opcode , None , frame. payload ) ) ) ;
226233 } else {
234+ if frame. payload . len ( ) >= max_message_size {
235+ return Err ( WebSocketError :: FrameTooLarge ) ;
236+ }
227237 self . fragments = match frame. opcode {
228238 OpCode :: Text => match utf8:: decode ( & frame. payload ) {
229- Ok ( text) => Some ( Fragment :: Text ( None , text. as_bytes ( ) . to_vec ( ) ) ) ,
239+ Ok ( text) => Some ( Fragment :: Text (
240+ None ,
241+ text. as_bytes ( ) . to_vec ( ) ,
242+ frame. payload . len ( ) ,
243+ ) ) ,
230244 Err ( utf8:: DecodeError :: Incomplete {
231245 valid_prefix,
232246 incomplete_suffix,
233247 } ) => Some ( Fragment :: Text (
234248 Some ( incomplete_suffix) ,
235249 valid_prefix. as_bytes ( ) . to_vec ( ) ,
250+ frame. payload . len ( ) ,
236251 ) ) ,
237252 Err ( utf8:: DecodeError :: Invalid { .. } ) => {
238253 return Err ( WebSocketError :: InvalidUTF8 ) ;
@@ -248,7 +263,15 @@ impl Fragments {
248263 None => {
249264 return Err ( WebSocketError :: InvalidContinuationFrame ) ;
250265 }
251- Some ( Fragment :: Text ( data, input) ) => {
266+ Some ( Fragment :: Text ( data, input, message_len) ) => {
267+ let new_message_len = message_len
268+ . checked_add ( frame. payload . len ( ) )
269+ . ok_or ( WebSocketError :: FrameTooLarge ) ?;
270+ if new_message_len >= max_message_size {
271+ return Err ( WebSocketError :: FrameTooLarge ) ;
272+ }
273+ * message_len = new_message_len;
274+
252275 let mut tail = & frame. payload [ ..] ;
253276 if let Some ( mut incomplete) = data. take ( ) {
254277 if let Some ( ( result, rest) ) =
@@ -296,6 +319,14 @@ impl Fragments {
296319 }
297320 }
298321 Some ( Fragment :: Binary ( data) ) => {
322+ let message_len = data
323+ . len ( )
324+ . checked_add ( frame. payload . len ( ) )
325+ . ok_or ( WebSocketError :: FrameTooLarge ) ?;
326+ if message_len >= max_message_size {
327+ return Err ( WebSocketError :: FrameTooLarge ) ;
328+ }
329+
299330 data. extend_from_slice ( & frame. payload ) ;
300331 if frame. fin {
301332 return Ok ( Some ( Frame :: new (
0 commit comments