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

@ -7989,11 +7989,18 @@ Read a file descriptor.");
static PyObject *
posix_read(PyObject *self, PyObject *args)
{
int fd, size;
int fd;
Py_ssize_t size;
Py_ssize_t n;
PyObject *buffer;
if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
if (!PyArg_ParseTuple(args, "in:read", &fd, &size))
return NULL;
if (!_PyVerify_fd(fd))
return posix_error();
#ifdef MS_WINDOWS
if (size > INT_MAX)
size = INT_MAX;
#endif
if (size < 0) {
errno = EINVAL;
return posix_error();
@ -8001,12 +8008,12 @@ posix_read(PyObject *self, PyObject *args)
buffer = PyBytes_FromStringAndSize((char *)NULL, size);
if (buffer == NULL)
return NULL;
if (!_PyVerify_fd(fd)) {
Py_DECREF(buffer);
return posix_error();
}
Py_BEGIN_ALLOW_THREADS
#ifdef MS_WINDOWS
n = read(fd, PyBytes_AS_STRING(buffer), (int)size);
#else
n = read(fd, PyBytes_AS_STRING(buffer), size);
#endif
Py_END_ALLOW_THREADS
if (n < 0) {
Py_DECREF(buffer);