diff -r 10c3d1527e88 Lib/test/test_file2k.py --- a/Lib/test/test_file2k.py Sat May 14 07:25:37 2016 +0000 +++ b/Lib/test/test_file2k.py Sun May 15 17:43:58 2016 +0200 @@ -15,7 +15,7 @@ threading = None from test import test_support -from test.test_support import TESTFN, run_unittest, requires +from test.test_support import TESTFN, run_unittest, requires, precisionbigmemtest, _2G from UserList import UserList class AutoFileTests(unittest.TestCase): @@ -463,6 +463,28 @@ self.assertEqual(l.count("\0"), size) l = None + @precisionbigmemtest(size=_2G, memuse=1, dry_run=False) + def testFileReadIsEightBytes(self, maxsize): + read_size = 2 ** 31 + if maxsize < read_size: + return + + f = open(TESTFN, 'wt') + f.write('a' * 1000) + f.close() + + f = open(TESTFN, 'rt') + # file.read() should always accept + # an eight-byte int as its buffersize parameter. + try: + data = f.read(read_size) + except OverflowError: + self.fail("should never get overflow error!") + except MemoryError: + # this is fine, this means parsing succeeded + # but allocating the buffer failed + pass + class FileSubclassTests(unittest.TestCase): def testExit(self): diff -r 10c3d1527e88 Objects/fileobject.c --- a/Objects/fileobject.c Sat May 14 07:25:37 2016 +0000 +++ b/Objects/fileobject.c Sun May 15 17:43:58 2016 +0200 @@ -1049,7 +1049,7 @@ static PyObject * file_read(PyFileObject *f, PyObject *args) { - long bytesrequested = -1; + Py_ssize_t bytesrequested = -1; size_t bytesread, buffersize, chunksize; PyObject *v; @@ -1062,17 +1062,12 @@ (f->f_bufend - f->f_bufptr) > 0 && f->f_buf[0] != '\0') return err_iterbuffered(); - if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested)) + if (!PyArg_ParseTuple(args, "|n:read", &bytesrequested)) return NULL; if (bytesrequested < 0) buffersize = new_buffersize(f, (size_t)0); else buffersize = bytesrequested; - if (buffersize > PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_OverflowError, - "requested number of bytes is more than a Python string can hold"); - return NULL; - } v = PyString_FromStringAndSize((char *)NULL, buffersize); if (v == NULL) return NULL;