mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
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:
parent
0d63f1228d
commit
b28ed92dd0
3 changed files with 37 additions and 6 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue