@@ -352,6 +352,7 @@ def parse(
352352 self , stream : t .IO [bytes ], boundary : bytes , content_length : int | None
353353 ) -> tuple [MultiDict [str , str ], MultiDict [str , FileStorage ]]:
354354 current_part : Field | File
355+ field_size : int | None = None
355356 container : t .IO [bytes ] | list [bytes ]
356357 _write : t .Callable [[bytes ], t .Any ]
357358
@@ -370,13 +371,23 @@ def parse(
370371 while not isinstance (event , (Epilogue , NeedData )):
371372 if isinstance (event , Field ):
372373 current_part = event
374+ field_size = 0
373375 container = []
374376 _write = container .append
375377 elif isinstance (event , File ):
376378 current_part = event
379+ field_size = None
377380 container = self .start_file_streaming (event , content_length )
378381 _write = container .write
379382 elif isinstance (event , Data ):
383+ if self .max_form_memory_size is not None and field_size is not None :
384+ # Ensure that accumulated data events do not exceed limit.
385+ # Also checked within single event in MultipartDecoder.
386+ field_size += len (event .data )
387+
388+ if field_size > self .max_form_memory_size :
389+ raise RequestEntityTooLarge ()
390+
380391 _write (event .data )
381392 if not event .more_data :
382393 if isinstance (current_part , Field ):
0 commit comments