mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-26730: Fix SpooledTemporaryFile data corruption (GH-17400)
SpooledTemporaryFile.rollback() might cause data corruption when it is in text mode. Co-Authored-By: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
1bddf890e5
commit
ea9835c5d1
4 changed files with 27 additions and 19 deletions
|
@ -633,10 +633,9 @@ class SpooledTemporaryFile:
|
|||
if 'b' in mode:
|
||||
self._file = _io.BytesIO()
|
||||
else:
|
||||
# Setting newline="\n" avoids newline translation;
|
||||
# this is important because otherwise on Windows we'd
|
||||
# get double newline translation upon rollover().
|
||||
self._file = _io.StringIO(newline="\n")
|
||||
self._file = _io.TextIOWrapper(_io.BytesIO(),
|
||||
encoding=encoding, errors=errors,
|
||||
newline=newline)
|
||||
self._max_size = max_size
|
||||
self._rolled = False
|
||||
self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
|
||||
|
@ -656,8 +655,12 @@ class SpooledTemporaryFile:
|
|||
newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
|
||||
del self._TemporaryFileArgs
|
||||
|
||||
newfile.write(file.getvalue())
|
||||
newfile.seek(file.tell(), 0)
|
||||
pos = file.tell()
|
||||
if hasattr(newfile, 'buffer'):
|
||||
newfile.buffer.write(file.detach().getvalue())
|
||||
else:
|
||||
newfile.write(file.getvalue())
|
||||
newfile.seek(pos, 0)
|
||||
|
||||
self._rolled = True
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue