From ad7736faf5b82a24374c601a72599adf29951080 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 25 Sep 2019 14:47:04 +0900 Subject: bpo-38265: Update os.pread to accept the length type as Py_ssize_t. (GH-16359) --- .../Library/2019-09-25-05-16-19.bpo-38265.X6-gsT.rst | 2 ++ Modules/clinic/posixmodule.c.h | 20 ++++++++++++++------ Modules/posixmodule.c | 7 +++---- 3 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-09-25-05-16-19.bpo-38265.X6-gsT.rst diff --git a/Misc/NEWS.d/next/Library/2019-09-25-05-16-19.bpo-38265.X6-gsT.rst b/Misc/NEWS.d/next/Library/2019-09-25-05-16-19.bpo-38265.X6-gsT.rst new file mode 100644 index 0000000..bd69a26 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-25-05-16-19.bpo-38265.X6-gsT.rst @@ -0,0 +1,2 @@ +Update the *length* parameter of :func:`os.pread` to accept +:c:type:`Py_ssize_t` instead of :c:type:`int`. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index b21d174..00b05f7 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -4799,14 +4799,14 @@ PyDoc_STRVAR(os_pread__doc__, {"pread", (PyCFunction)(void(*)(void))os_pread, METH_FASTCALL, os_pread__doc__}, static PyObject * -os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset); +os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset); static PyObject * os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; int fd; - int length; + Py_ssize_t length; Py_off_t offset; if (!_PyArg_CheckPositional("pread", nargs, 3, 3)) { @@ -4826,9 +4826,17 @@ os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - length = _PyLong_AsInt(args[1]); - if (length == -1 && PyErr_Occurred()) { - goto exit; + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; } if (!Py_off_t_converter(args[2], &offset)) { goto exit; @@ -8723,4 +8731,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=113d9fbdd18a62f5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=799c75140d84ace5 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c60d0c5..5664027 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8827,11 +8827,10 @@ os_readv_impl(PyObject *module, int fd, PyObject *buffers) #ifdef HAVE_PREAD /*[clinic input] -# TODO length should be size_t! but Python doesn't support parsing size_t yet. os.pread fd: int - length: int + length: Py_ssize_t offset: Py_off_t / @@ -8842,8 +8841,8 @@ the beginning of the file. The file offset remains unchanged. [clinic start generated code]*/ static PyObject * -os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset) -/*[clinic end generated code: output=435b29ee32b54a78 input=084948dcbaa35d4c]*/ +os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset) +/*[clinic end generated code: output=3f875c1eef82e32f input=85cb4a5589627144]*/ { Py_ssize_t n; int async_err = 0; -- cgit v0.12