From 23f427a0fdb888212136cf8745a9f5f832a3f374 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Fri, 7 Sep 2018 15:17:18 +0300 Subject: [3.6] bpo-34563: Fix for invalid assert on big output of multiprocessing.Process (GH-9027) (GH-9069) Fix for invalid assert on big output of multiprocessing.Process. (cherry picked from commit 266f4904a222a784080e29aad0916849e507515d) --- .../next/Library/2018-09-01-20-43-10.bpo-34563.7NQK7B.rst | 1 + Modules/_winapi.c | 10 +++++----- Modules/clinic/_winapi.c.h | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-09-01-20-43-10.bpo-34563.7NQK7B.rst diff --git a/Misc/NEWS.d/next/Library/2018-09-01-20-43-10.bpo-34563.7NQK7B.rst b/Misc/NEWS.d/next/Library/2018-09-01-20-43-10.bpo-34563.7NQK7B.rst new file mode 100644 index 0000000..9127af0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-01-20-43-10.bpo-34563.7NQK7B.rst @@ -0,0 +1 @@ +On Windows, fix multiprocessing.Connection for very large read: fix _winapi.PeekNamedPipe() and _winapi.ReadFile() for read larger than INT_MAX (usually 2^31-1). \ No newline at end of file diff --git a/Modules/_winapi.c b/Modules/_winapi.c index b98e778..0647f6b 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -1167,7 +1167,7 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size) } if (_PyBytes_Resize(&buf, nread)) return NULL; - return Py_BuildValue("Nii", buf, navail, nleft); + return Py_BuildValue("NII", buf, navail, nleft); } else { Py_BEGIN_ALLOW_THREADS @@ -1176,7 +1176,7 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size) if (!ret) { return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0); } - return Py_BuildValue("ii", navail, nleft); + return Py_BuildValue("II", navail, nleft); } } @@ -1184,14 +1184,14 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size) _winapi.ReadFile handle: HANDLE - size: int + size: DWORD overlapped as use_overlapped: int(c_default='0') = False [clinic start generated code]*/ static PyObject * -_winapi_ReadFile_impl(PyObject *module, HANDLE handle, int size, +_winapi_ReadFile_impl(PyObject *module, HANDLE handle, DWORD size, int use_overlapped) -/*[clinic end generated code: output=492029ca98161d84 input=8dd810194e86ac7d]*/ +/*[clinic end generated code: output=d3d5b44a8201b944 input=1b7d0ed0de1e50bc]*/ { DWORD nread; PyObject *buf; diff --git a/Modules/clinic/_winapi.c.h b/Modules/clinic/_winapi.c.h index 5bfbaf0..feb98bc 100644 --- a/Modules/clinic/_winapi.c.h +++ b/Modules/clinic/_winapi.c.h @@ -673,7 +673,7 @@ PyDoc_STRVAR(_winapi_ReadFile__doc__, {"ReadFile", (PyCFunction)_winapi_ReadFile, METH_FASTCALL, _winapi_ReadFile__doc__}, static PyObject * -_winapi_ReadFile_impl(PyObject *module, HANDLE handle, int size, +_winapi_ReadFile_impl(PyObject *module, HANDLE handle, DWORD size, int use_overlapped); static PyObject * @@ -681,9 +681,9 @@ _winapi_ReadFile(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"handle", "size", "overlapped", NULL}; - static _PyArg_Parser _parser = {"" F_HANDLE "i|i:ReadFile", _keywords, 0}; + static _PyArg_Parser _parser = {"" F_HANDLE "k|i:ReadFile", _keywords, 0}; HANDLE handle; - int size; + DWORD size; int use_overlapped = 0; if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, @@ -889,4 +889,4 @@ _winapi_WriteFile(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject exit: return return_value; } -/*[clinic end generated code: output=46d6382a6662c4a9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6c5cf8865d381c70 input=a9049054013a1b77]*/ -- cgit v0.12