Skip to content

Commit

Permalink
Fix: slow multipart parsing for huge files with few CR/LF characters
Browse files Browse the repository at this point in the history
  • Loading branch information
psrok1 authored and Roconda committed Oct 30, 2023
1 parent 26f3e95 commit f230020
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/werkzeug/sansio/multipart.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,12 +251,20 @@ def _parse_data(self, data: bytes, *, start: bool) -> tuple[bytes, int, bool]:
else:
data_start = 0

if self.buffer.find(b"--" + self.boundary) == -1:
boundary = b"--" + self.boundary

if self.buffer.find(boundary) == -1:
# No complete boundary in the buffer, but there may be
# a partial boundary at the end. As the boundary
# starts with either a nl or cr find the earliest and
# return up to that as data.
data_end = del_index = self.last_newline(data[data_start:]) + data_start
# If amount of data after last newline is far from
# possible length of partial boundary, we should
# assume that there is no partial boundary in the buffer
# and return all pending data.
if (len(data) - data_end) > len(b"\n" + boundary):
data_end = del_index = len(data)
more_data = True
else:
match = self.boundary_re.search(data)
Expand Down

0 comments on commit f230020

Please sign in to comment.