mirror of
https://github.com/python/cpython.git
synced 2025-12-10 11:00:14 +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
|
|
@ -1114,7 +1114,8 @@ class TestSpooledTemporaryFile(BaseTestCase):
|
|||
def test_text_mode(self):
|
||||
# Creating a SpooledTemporaryFile with a text mode should produce
|
||||
# a file object reading and writing (Unicode) text strings.
|
||||
f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10)
|
||||
f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
|
||||
encoding="utf-8")
|
||||
f.write("abc\n")
|
||||
f.seek(0)
|
||||
self.assertEqual(f.read(), "abc\n")
|
||||
|
|
@ -1124,9 +1125,9 @@ class TestSpooledTemporaryFile(BaseTestCase):
|
|||
self.assertFalse(f._rolled)
|
||||
self.assertEqual(f.mode, 'w+')
|
||||
self.assertIsNone(f.name)
|
||||
self.assertIsNone(f.newlines)
|
||||
self.assertIsNone(f.encoding)
|
||||
self.assertIsNone(f.errors)
|
||||
self.assertEqual(f.newlines, os.linesep)
|
||||
self.assertEqual(f.encoding, "utf-8")
|
||||
self.assertEqual(f.errors, "strict")
|
||||
|
||||
f.write("xyzzy\n")
|
||||
f.seek(0)
|
||||
|
|
@ -1139,8 +1140,8 @@ class TestSpooledTemporaryFile(BaseTestCase):
|
|||
self.assertEqual(f.mode, 'w+')
|
||||
self.assertIsNotNone(f.name)
|
||||
self.assertEqual(f.newlines, os.linesep)
|
||||
self.assertIsNotNone(f.encoding)
|
||||
self.assertIsNotNone(f.errors)
|
||||
self.assertEqual(f.encoding, "utf-8")
|
||||
self.assertEqual(f.errors, "strict")
|
||||
|
||||
def test_text_newline_and_encoding(self):
|
||||
f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
|
||||
|
|
@ -1152,13 +1153,15 @@ class TestSpooledTemporaryFile(BaseTestCase):
|
|||
self.assertFalse(f._rolled)
|
||||
self.assertEqual(f.mode, 'w+')
|
||||
self.assertIsNone(f.name)
|
||||
self.assertIsNone(f.newlines)
|
||||
self.assertIsNone(f.encoding)
|
||||
self.assertIsNone(f.errors)
|
||||
self.assertIsNotNone(f.newlines)
|
||||
self.assertEqual(f.encoding, "utf-8")
|
||||
self.assertEqual(f.errors, "ignore")
|
||||
|
||||
f.write("\u039B" * 20 + "\r\n")
|
||||
f.write("\u039C" * 10 + "\r\n")
|
||||
f.write("\u039D" * 20)
|
||||
f.seek(0)
|
||||
self.assertEqual(f.read(), "\u039B\r\n" + ("\u039B" * 20) + "\r\n")
|
||||
self.assertEqual(f.read(),
|
||||
"\u039B\r\n" + ("\u039C" * 10) + "\r\n" + ("\u039D" * 20))
|
||||
self.assertTrue(f._rolled)
|
||||
self.assertEqual(f.mode, 'w+')
|
||||
self.assertIsNotNone(f.name)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue