diff -r ff5648697ac7 Lib/test/test_file2k.py --- a/Lib/test/test_file2k.py Tue Apr 15 08:01:27 2014 -0700 +++ b/Lib/test/test_file2k.py Wed Apr 16 19:01:50 2014 -0400 @@ -831,6 +831,23 @@ 'sys.stdout.flush()') self.assertEqual(stdout, "\xe9") + def testFileReadIsEightBytes(self): + 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(2 ** 33) + except OverflowError: + self.fail("should never get overflow error!") + except MemoryError: + # this is fine, this means parsing succeeded + # but allocating the buffer failed + pass + def test_main(): # Historically, these tests have been sloppy about removing TESTFN. diff -r ff5648697ac7 Objects/fileobject.c --- a/Objects/fileobject.c Tue Apr 15 08:01:27 2014 -0700 +++ b/Objects/fileobject.c Wed Apr 16 19:01:50 2014 -0400 @@ -1051,7 +1051,7 @@ static PyObject * file_read(PyFileObject *f, PyObject *args) { - long bytesrequested = -1; + Py_ssize_t bytesrequested = -1; size_t bytesread, buffersize, chunksize; PyObject *v; @@ -1064,17 +1064,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;