Kaydet (Commit) e2cc341f authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data

when \r\n appears at end of 65535 bytes without other newlines.
üst a49dcc51
...@@ -697,6 +697,9 @@ class FieldStorage: ...@@ -697,6 +697,9 @@ class FieldStorage:
if not line: if not line:
self.done = -1 self.done = -1
break break
if delim == "\r":
line = delim + line
delim = ""
if line[:2] == "--" and last_line_lfend: if line[:2] == "--" and last_line_lfend:
strippedline = line.strip() strippedline = line.strip()
if strippedline == next: if strippedline == next:
...@@ -713,6 +716,12 @@ class FieldStorage: ...@@ -713,6 +716,12 @@ class FieldStorage:
delim = "\n" delim = "\n"
line = line[:-1] line = line[:-1]
last_line_lfend = True last_line_lfend = True
elif line[-1] == "\r":
# We may interrupt \r\n sequences if they span the 2**16
# byte boundary
delim = "\r"
line = line[:-1]
last_line_lfend = False
else: else:
delim = "" delim = ""
last_line_lfend = False last_line_lfend = False
......
...@@ -266,6 +266,29 @@ Content-Disposition: form-data; name="submit" ...@@ -266,6 +266,29 @@ Content-Disposition: form-data; name="submit"
got = getattr(fs.list[x], k) got = getattr(fs.list[x], k)
self.assertEqual(got, exp) self.assertEqual(got, exp)
def test_fieldstorage_multipart_maxline(self):
# Issue #18167
maxline = 1 << 16
self.maxDiff = None
def check(content):
data = """
---123
Content-Disposition: form-data; name="upload"; filename="fake.txt"
Content-Type: text/plain
%s
---123--
""".replace('\n', '\r\n') % content
environ = {
'CONTENT_LENGTH': str(len(data)),
'CONTENT_TYPE': 'multipart/form-data; boundary=-123',
'REQUEST_METHOD': 'POST',
}
self.assertEqual(gen_result(data, environ), {'upload': content})
check('x' * (maxline - 1))
check('x' * (maxline - 1) + '\r')
check('x' * (maxline - 1) + '\r' + 'y' * (maxline - 1))
_qs_result = { _qs_result = {
'key1': 'value1', 'key1': 'value1',
'key2': ['value2x', 'value2y'], 'key2': ['value2x', 'value2y'],
......
...@@ -18,6 +18,9 @@ Core and Builtins ...@@ -18,6 +18,9 @@ Core and Builtins
Library Library
------- -------
- Issue #18167: cgi.FieldStorage no more fails to handle multipart/form-data
when \r\n appears at end of 65535 bytes without other newlines.
- Issue #17403: urllib.parse.robotparser normalizes the urls before adding to - Issue #17403: urllib.parse.robotparser normalizes the urls before adding to
ruleline. This helps in handling certain types invalid urls in a conservative ruleline. This helps in handling certain types invalid urls in a conservative
manner. Patch contributed by Mher Movsisyan. manner. Patch contributed by Mher Movsisyan.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment