From 561bd00b45a3e125a01c80090c11f6e46cd61e48 Mon Sep 17 00:00:00 2001 From: Charlie Zhao Date: Tue, 1 Nov 2022 02:22:02 +0800 Subject: [PATCH 1/3] [3.9] gh-98793: Fix typecheck in `overlapped.c` (GH-98835) (GH-98890) (cherry picked from commit d3d1738acd4f62869d7f1e119c257e2ee46fd16f) Co-authored-by: Charlie Zhao Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> (cherry picked from commit 3ac8c0ab6ee819a14b1c8e0992acbaf376a46058) --- Lib/test/test_asyncio/test_windows_events.py | 11 +++++++++++ .../2022-10-29-03-40-18.gh-issue-98793.WSPB4A.rst | 1 + 2 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2022-10-29-03-40-18.gh-issue-98793.WSPB4A.rst diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index a8939d58540f47..0e9d09af142833 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -279,6 +279,17 @@ def threadMain(): stop.set() thr.join() + def test_address_argument_type_error(self): + # Regression test for https://github.com/python/cpython/issues/98793 + proactor = self.loop._proactor + sock = socket.socket(type=socket.SOCK_DGRAM) + bad_address = None + with self.assertRaises(TypeError): + proactor.connect(sock, bad_address) + with self.assertRaises(TypeError): + proactor.sendto(sock, b'abc', addr=bad_address) + sock.close() + class WinPolicyTests(WindowsEventsTestCase): diff --git a/Misc/NEWS.d/next/Library/2022-10-29-03-40-18.gh-issue-98793.WSPB4A.rst b/Misc/NEWS.d/next/Library/2022-10-29-03-40-18.gh-issue-98793.WSPB4A.rst new file mode 100644 index 00000000000000..7b67af06cf3d17 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-10-29-03-40-18.gh-issue-98793.WSPB4A.rst @@ -0,0 +1 @@ +Fix argument typechecks in :func:`!_overlapped.WSAConnect` and :func:`!_overlapped.Overlapped.WSASendTo` functions. From 97e53c4015ca2964e49c8b684c1c1b23d142e335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Fri, 31 Oct 2025 15:38:38 +0100 Subject: [PATCH 2/3] Switch overlapped_WSAConnect() and Overlapped_WSASendTo() to METH_FASTCALL --- Modules/overlapped.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 5f8a82347355d9..1d007e61886463 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -1543,7 +1543,7 @@ PyDoc_STRVAR( * _only_ be used for connectionless sockets (UDP). */ static PyObject * -overlapped_WSAConnect(PyObject *self, PyObject *args) +overlapped_WSAConnect(PyObject *self, PyObject *args, Py_ssize_t nargs) { SOCKET ConnectSocket; PyObject *AddressObj; @@ -1552,7 +1552,9 @@ overlapped_WSAConnect(PyObject *self, PyObject *args) int Length; int err; - if (!PyArg_ParseTuple(args, F_HANDLE "O", &ConnectSocket, &AddressObj)) { + + if (!_PyArg_ParseStack(args, nargs, F_HANDLE "O!:WSAConnect", + &ConnectSocket, &PyTuple_Type, &AddressObj)) { return NULL; } @@ -1584,7 +1586,7 @@ PyDoc_STRVAR( "Start overlapped sendto over a connectionless (UDP) socket"); static PyObject * -Overlapped_WSASendTo(OverlappedObject *self, PyObject *args) +Overlapped_WSASendTo(OverlappedObject *self, PyObject *args, Py_ssize_t nargs) { HANDLE handle; PyObject *bufobj; @@ -1598,8 +1600,8 @@ Overlapped_WSASendTo(OverlappedObject *self, PyObject *args) int ret; DWORD err; - if (!PyArg_ParseTuple(args, F_HANDLE "O" F_DWORD "O", - &handle, &bufobj, &flags, &AddressObj)) + if (!_PyArg_ParseStack(args, nargs, F_HANDLE "OkO!:WSASendTo", + &handle, &bufobj, &flags, &PyTuple_Type, &AddressObj)) { return NULL; } @@ -1752,7 +1754,7 @@ static PyMethodDef Overlapped_methods[] = { {"WSARecvFrom", (PyCFunction) Overlapped_WSARecvFrom, METH_VARARGS, Overlapped_WSARecvFrom_doc }, {"WSASendTo", (PyCFunction) Overlapped_WSASendTo, - METH_VARARGS, Overlapped_WSASendTo_doc }, + METH_FASTCALL, Overlapped_WSASendTo_doc }, {NULL} }; @@ -1841,7 +1843,7 @@ static PyMethodDef overlapped_functions[] = { {"ConnectPipe", overlapped_ConnectPipe, METH_VARARGS, ConnectPipe_doc}, {"WSAConnect", overlapped_WSAConnect, - METH_VARARGS, WSAConnect_doc}, + METH_FASTCALL, WSAConnect_doc}, {NULL} }; From 0cbe5e49a682f9e2531409b76b3c3b0bfadb9b81 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Fri, 31 Oct 2025 16:11:06 +0100 Subject: [PATCH 3/3] Minimize diff: use METH_VARARGS again --- Modules/overlapped.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 1d007e61886463..0abe5b781138bf 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -1543,7 +1543,7 @@ PyDoc_STRVAR( * _only_ be used for connectionless sockets (UDP). */ static PyObject * -overlapped_WSAConnect(PyObject *self, PyObject *args, Py_ssize_t nargs) +overlapped_WSAConnect(PyObject *self, PyObject *args) { SOCKET ConnectSocket; PyObject *AddressObj; @@ -1553,8 +1553,8 @@ overlapped_WSAConnect(PyObject *self, PyObject *args, Py_ssize_t nargs) int err; - if (!_PyArg_ParseStack(args, nargs, F_HANDLE "O!:WSAConnect", - &ConnectSocket, &PyTuple_Type, &AddressObj)) { + if (!PyArg_ParseTuple(args, F_HANDLE "O!:WSAConnect", + &ConnectSocket, &PyTuple_Type, &AddressObj)) { return NULL; } @@ -1586,7 +1586,7 @@ PyDoc_STRVAR( "Start overlapped sendto over a connectionless (UDP) socket"); static PyObject * -Overlapped_WSASendTo(OverlappedObject *self, PyObject *args, Py_ssize_t nargs) +Overlapped_WSASendTo(OverlappedObject *self, PyObject *args) { HANDLE handle; PyObject *bufobj; @@ -1600,7 +1600,7 @@ Overlapped_WSASendTo(OverlappedObject *self, PyObject *args, Py_ssize_t nargs) int ret; DWORD err; - if (!_PyArg_ParseStack(args, nargs, F_HANDLE "OkO!:WSASendTo", + if (!PyArg_ParseTuple(args, F_HANDLE "OkO!:WSASendTo", &handle, &bufobj, &flags, &PyTuple_Type, &AddressObj)) { return NULL; @@ -1754,7 +1754,7 @@ static PyMethodDef Overlapped_methods[] = { {"WSARecvFrom", (PyCFunction) Overlapped_WSARecvFrom, METH_VARARGS, Overlapped_WSARecvFrom_doc }, {"WSASendTo", (PyCFunction) Overlapped_WSASendTo, - METH_FASTCALL, Overlapped_WSASendTo_doc }, + METH_VARARGS, Overlapped_WSASendTo_doc }, {NULL} }; @@ -1843,7 +1843,7 @@ static PyMethodDef overlapped_functions[] = { {"ConnectPipe", overlapped_ConnectPipe, METH_VARARGS, ConnectPipe_doc}, {"WSAConnect", overlapped_WSAConnect, - METH_FASTCALL, WSAConnect_doc}, + METH_VARARGS, WSAConnect_doc}, {NULL} };