mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
Issue #5677: Explicitly forbid write operations on read-only file objects,
and read operations on write-only file objects. On Windows, the system C library would return a bogus result; on Solaris, it was possible to crash the interpreter. Patch by Stefan Krah.
This commit is contained in:
parent
007a618a38
commit
bb445a1f22
6 changed files with 77 additions and 1 deletions
|
@ -86,6 +86,8 @@ class AutoFileTests(unittest.TestCase):
|
|||
self.assertTrue(repr(self.f).startswith("<open file '" + TESTFN))
|
||||
|
||||
def testErrors(self):
|
||||
self.f.close()
|
||||
self.f = open(TESTFN, 'rb')
|
||||
f = self.f
|
||||
self.assertEquals(f.name, TESTFN)
|
||||
self.assertTrue(not f.isatty())
|
||||
|
@ -123,6 +125,40 @@ class AutoFileTests(unittest.TestCase):
|
|||
def testReadWhenWriting(self):
|
||||
self.assertRaises(IOError, self.f.read)
|
||||
|
||||
def testIssue5677(self):
|
||||
# Remark: Do not perform more than one test per open file,
|
||||
# since that does NOT catch the readline error on Windows.
|
||||
data = 'xxx'
|
||||
for mode in ['w', 'wb', 'a', 'ab']:
|
||||
for attr in ['read', 'readline', 'readlines']:
|
||||
self.f = open(TESTFN, mode)
|
||||
self.f.write(data)
|
||||
self.assertRaises(IOError, getattr(self.f, attr))
|
||||
self.f.close()
|
||||
|
||||
self.f = open(TESTFN, mode)
|
||||
self.f.write(data)
|
||||
self.assertRaises(IOError, lambda: [line for line in self.f])
|
||||
self.f.close()
|
||||
|
||||
self.f = open(TESTFN, mode)
|
||||
self.f.write(data)
|
||||
self.assertRaises(IOError, self.f.readinto, bytearray(len(data)))
|
||||
self.f.close()
|
||||
|
||||
for mode in ['r', 'rb', 'U', 'Ub', 'Ur', 'rU', 'rbU', 'rUb']:
|
||||
self.f = open(TESTFN, mode)
|
||||
self.assertRaises(IOError, self.f.write, data)
|
||||
self.f.close()
|
||||
|
||||
self.f = open(TESTFN, mode)
|
||||
self.assertRaises(IOError, self.f.writelines, [data, data])
|
||||
self.f.close()
|
||||
|
||||
self.f = open(TESTFN, mode)
|
||||
self.assertRaises(IOError, self.f.truncate)
|
||||
self.f.close()
|
||||
|
||||
class OtherFileTests(unittest.TestCase):
|
||||
|
||||
def testOpenDir(self):
|
||||
|
|
|
@ -581,7 +581,7 @@ class SizeofTest(unittest.TestCase):
|
|||
# enumerate
|
||||
check(enumerate([]), size(h + 'l3P'))
|
||||
# file
|
||||
check(self.file, size(h + '4P2i4P3i3Pi'))
|
||||
check(self.file, size(h + '4P2i4P3i3P3i'))
|
||||
# float
|
||||
check(float(0), size(h + 'd'))
|
||||
# sys.floatinfo
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue