Opened 11 years ago
Last modified 11 years ago
#23397 closed Bug
Multipart base64 file decoding of fails with large files when the encoded string contains newlines. — at Version 1
| Reported by: | jhobbs | Owned by: | nobody |
|---|---|---|---|
| Component: | HTTP handling | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Large files are files larger than the chunk size in MultiPartParser.parse().
Parse tries to process base64 encoded files in chunks with lengths a multiple of 4. The base64 encoded string can contain newline characters, which aren't significant in base64 and should be ignored, but are counted toward's a chunk's length in parse(). This means when whitespace is stripped from the string, the count of base64 encoded characters may not be a multiple of 4, leading to an "Incorrect padding" error.
Here's a testcase for creating this failure:
https://github.com/jhobbs/django/commit/98347e396133990b82b596310e4490369ba676d5
Stacktrace:
Traceback (most recent call last):
File "/home/jason/canonical/code/django/tests/file_uploads/tests.py", line 109, in test_big_base64_newlines_upload
"Big data" * 68000, encode=base64.encodestring)
File "/home/jason/canonical/code/django/tests/file_uploads/tests.py", line 96, in _test_base64_upload
response = self.client.request(**r)
File "/home/jason/canonical/code/django/django/test/client.py", line 443, in request
six.reraise(*exc_info)
File "/home/jason/canonical/code/django/django/core/handlers/base.py", line 121, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/jason/canonical/code/django/tests/file_uploads/views.py", line 103, in file_upload_echo_content
r = dict((k, f.read().decode('utf-8')) for k, f in request.FILES.items())
File "/home/jason/canonical/code/django/django/core/handlers/wsgi.py", line 152, in _get_files
self._load_post_and_files()
File "/home/jason/canonical/code/django/django/http/request.py", line 249, in _load_post_and_files
self._post, self._files = self.parse_file_upload(self.META, data)
File "/home/jason/canonical/code/django/django/http/request.py", line 214, in parse_file_upload
return parser.parse()
File "/home/jason/canonical/code/django/django/http/multipartparser.py", line 220, in parse
six.reraise(MultiPartParserError, MultiPartParserError(msg), sys.exc_info()[2])
File "/home/jason/canonical/code/django/django/http/multipartparser.py", line 216, in parse
chunk = base64.b64decode(chunk)
File "/usr/lib/python2.7/base64.py", line 76, in b64decode
raise TypeError(msg)
MultiPartParserError: Could not decode base64 data: TypeError(Error('Incorrect padding',),)