Issue #21932: os.read() now uses a :c:func:Py_ssize_t type instead of

:c:type:`int` for the size to support reading more than 2 GB at once. On
Windows, the size is truncted to INT_MAX. As any call to os.read(), the OS
may read less bytes than the number of requested bytes.
This commit is contained in:
Victor Stinner 2014-07-11 17:04:41 +02:00
parent 0d63f1228d
commit b28ed92dd0
3 changed files with 37 additions and 6 deletions

View file

@ -43,6 +43,10 @@ try:
import _winapi
except ImportError:
_winapi = None
try:
from _testcapi import INT_MAX
except ImportError:
INT_MAX = 2 ** 31 - 1
from test.script_helper import assert_python_ok
@ -119,6 +123,21 @@ class FileTests(unittest.TestCase):
self.assertEqual(type(s), bytes)
self.assertEqual(s, b"spam")
def test_large_read(self):
with open(support.TESTFN, "wb") as fp:
fp.write(b'test')
self.addCleanup(support.unlink, support.TESTFN)
# Issue #21932: Make sure that os.read() does not raise an
# OverflowError for size larger than INT_MAX
size = INT_MAX + 10
with open(support.TESTFN, "rb") as fp:
data = os.read(fp.fileno(), size)
# The test does not try to read more than 2 GB at once because the
# operating system is free to return less bytes than requested.
self.assertEqual(data, b'test')
def test_write(self):
# os.write() accepts bytes- and buffer-like objects but not strings
fd = os.open(support.TESTFN, os.O_CREAT | os.O_WRONLY)