Skip to content

Commit 21e5e48

Browse files
Propagating max_num_fields to FieldStorage subclass
1 parent d846e2b commit 21e5e48

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

Lib/cgi.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -637,12 +637,22 @@ def read_multi(self, environ, keep_blank_values, strict_parsing):
637637
if 'content-length' in headers:
638638
del headers['content-length']
639639

640+
# Propagate max_num_fields into the sub class appropriately
641+
sub_max_num_fields = self.max_num_fields
642+
if sub_max_num_fields is not None:
643+
sub_max_num_fields -= len(self.list)
644+
640645
part = klass(self.fp, headers, ib, environ, keep_blank_values,
641646
strict_parsing,self.limit-self.bytes_read,
642-
self.encoding, self.errors)
647+
self.encoding, self.errors, sub_max_num_fields)
648+
649+
max_num_fields = self.max_num_fields
650+
if max_num_fields is not None and part.list:
651+
max_num_fields -= len(part.list)
652+
643653
self.bytes_read += part.bytes_read
644654
self.list.append(part)
645-
if self.max_num_fields is not None and self.max_num_fields < len(self.list):
655+
if max_num_fields is not None and max_num_fields < len(self.list):
646656
raise ValueError('Max number of fields exceeded')
647657
if part.done or self.bytes_read >= self.length > 0:
648658
break

Lib/test/test_cgi.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,8 @@ def test_max_num_fields(self):
391391
}
392392

393393
with self.assertRaises(ValueError):
394-
form = cgi.FieldStorage(
395-
fp=BytesIO(data.encode('ascii')),
394+
cgi.FieldStorage(
395+
fp=BytesIO(data.encode()),
396396
environ=environ,
397397
max_num_fields=10,
398398
)
@@ -403,13 +403,9 @@ def test_max_num_fields(self):
403403
404404
a
405405
---123
406-
Content-Disposition: form-data; name="a"
407-
408-
a
409-
---123
410-
Content-Disposition: form-data; name="a"
406+
Content-Type: application/x-www-form-urlencoded
411407
412-
a
408+
a=a&a=a
413409
---123--
414410
"""
415411
environ = {
@@ -419,12 +415,20 @@ def test_max_num_fields(self):
419415
'REQUEST_METHOD': 'POST',
420416
}
421417

418+
# 2 GET entities
419+
# 2 top level POST entities
420+
# 2 entities within the second POST entity
422421
with self.assertRaises(ValueError):
423-
form = cgi.FieldStorage(
424-
fp=BytesIO(data.encode('ascii')),
422+
cgi.FieldStorage(
423+
fp=BytesIO(data.encode()),
425424
environ=environ,
426-
max_num_fields=4,
425+
max_num_fields=5,
427426
)
427+
cgi.FieldStorage(
428+
fp=BytesIO(data.encode()),
429+
environ=environ,
430+
max_num_fields=6,
431+
)
428432

429433
def testQSAndFormData(self):
430434
data = """---123

0 commit comments

Comments
 (0)