[Python-checkins] gh-94512: Fix forced arg format in AC-processed overlapped (GH-94516)

zooba webhook-mailer at python.org
Thu Jul 28 18:10:19 EDT 2022


https://github.com/python/cpython/commit/26d4af0ba538ea58d7a7fdbcc4471d9b32689b28
commit: 26d4af0ba538ea58d7a7fdbcc4471d9b32689b28
branch: main
author: Oleg Iarygin <oleg at arhadthedev.net>
committer: zooba <steve.dower at microsoft.com>
date: 2022-07-28T23:09:46+01:00
summary:

gh-94512: Fix forced arg format in AC-processed overlapped (GH-94516)

files:
M Modules/clinic/overlapped.c.h
M Modules/overlapped.c

diff --git a/Modules/clinic/overlapped.c.h b/Modules/clinic/overlapped.c.h
index cac44d0a5764c..721b38c75ceef 100644
--- a/Modules/clinic/overlapped.c.h
+++ b/Modules/clinic/overlapped.c.h
@@ -26,8 +26,22 @@ _overlapped_CreateIoCompletionPort(PyObject *module, PyObject *const *args, Py_s
     ULONG_PTR CompletionKey;
     DWORD NumberOfConcurrentThreads;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE""F_HANDLE""F_ULONG_PTR"k:CreateIoCompletionPort",
-        &FileHandle, &ExistingCompletionPort, &CompletionKey, &NumberOfConcurrentThreads)) {
+    if (!_PyArg_CheckPositional("CreateIoCompletionPort", nargs, 4, 4)) {
+        goto exit;
+    }
+    FileHandle = PyLong_AsVoidPtr(args[0]);
+    if (!FileHandle && PyErr_Occurred()) {
+        goto exit;
+    }
+    ExistingCompletionPort = PyLong_AsVoidPtr(args[1]);
+    if (!ExistingCompletionPort && PyErr_Occurred()) {
+        goto exit;
+    }
+    CompletionKey = PyLong_AsVoidPtr(args[2]);
+    if (!CompletionKey && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[3], &NumberOfConcurrentThreads)) {
         goto exit;
     }
     return_value = _overlapped_CreateIoCompletionPort_impl(module, FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads);
@@ -59,8 +73,14 @@ _overlapped_GetQueuedCompletionStatus(PyObject *module, PyObject *const *args, P
     HANDLE CompletionPort;
     DWORD Milliseconds;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"k:GetQueuedCompletionStatus",
-        &CompletionPort, &Milliseconds)) {
+    if (!_PyArg_CheckPositional("GetQueuedCompletionStatus", nargs, 2, 2)) {
+        goto exit;
+    }
+    CompletionPort = PyLong_AsVoidPtr(args[0]);
+    if (!CompletionPort && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[1], &Milliseconds)) {
         goto exit;
     }
     return_value = _overlapped_GetQueuedCompletionStatus_impl(module, CompletionPort, Milliseconds);
@@ -94,8 +114,22 @@ _overlapped_PostQueuedCompletionStatus(PyObject *module, PyObject *const *args,
     ULONG_PTR CompletionKey;
     OVERLAPPED *Overlapped;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"k"F_ULONG_PTR""F_POINTER":PostQueuedCompletionStatus",
-        &CompletionPort, &NumberOfBytes, &CompletionKey, &Overlapped)) {
+    if (!_PyArg_CheckPositional("PostQueuedCompletionStatus", nargs, 4, 4)) {
+        goto exit;
+    }
+    CompletionPort = PyLong_AsVoidPtr(args[0]);
+    if (!CompletionPort && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[1], &NumberOfBytes)) {
+        goto exit;
+    }
+    CompletionKey = PyLong_AsVoidPtr(args[2]);
+    if (!CompletionKey && PyErr_Occurred()) {
+        goto exit;
+    }
+    Overlapped = PyLong_AsVoidPtr(args[3]);
+    if (!Overlapped && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_PostQueuedCompletionStatus_impl(module, CompletionPort, NumberOfBytes, CompletionKey, Overlapped);
@@ -129,8 +163,22 @@ _overlapped_RegisterWaitWithQueue(PyObject *module, PyObject *const *args, Py_ss
     OVERLAPPED *Overlapped;
     DWORD Milliseconds;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE""F_HANDLE""F_POINTER"k:RegisterWaitWithQueue",
-        &Object, &CompletionPort, &Overlapped, &Milliseconds)) {
+    if (!_PyArg_CheckPositional("RegisterWaitWithQueue", nargs, 4, 4)) {
+        goto exit;
+    }
+    Object = PyLong_AsVoidPtr(args[0]);
+    if (!Object && PyErr_Occurred()) {
+        goto exit;
+    }
+    CompletionPort = PyLong_AsVoidPtr(args[1]);
+    if (!CompletionPort && PyErr_Occurred()) {
+        goto exit;
+    }
+    Overlapped = PyLong_AsVoidPtr(args[2]);
+    if (!Overlapped && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[3], &Milliseconds)) {
         goto exit;
     }
     return_value = _overlapped_RegisterWaitWithQueue_impl(module, Object, CompletionPort, Overlapped, Milliseconds);
@@ -157,7 +205,8 @@ _overlapped_UnregisterWait(PyObject *module, PyObject *arg)
     PyObject *return_value = NULL;
     HANDLE WaitHandle;
 
-    if (!PyArg_Parse(arg, ""F_HANDLE":UnregisterWait", &WaitHandle)) {
+    WaitHandle = PyLong_AsVoidPtr(arg);
+    if (!WaitHandle && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_UnregisterWait_impl(module, WaitHandle);
@@ -186,8 +235,15 @@ _overlapped_UnregisterWaitEx(PyObject *module, PyObject *const *args, Py_ssize_t
     HANDLE WaitHandle;
     HANDLE Event;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE""F_HANDLE":UnregisterWaitEx",
-        &WaitHandle, &Event)) {
+    if (!_PyArg_CheckPositional("UnregisterWaitEx", nargs, 2, 2)) {
+        goto exit;
+    }
+    WaitHandle = PyLong_AsVoidPtr(args[0]);
+    if (!WaitHandle && PyErr_Occurred()) {
+        goto exit;
+    }
+    Event = PyLong_AsVoidPtr(args[1]);
+    if (!Event && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_UnregisterWaitEx_impl(module, WaitHandle, Event);
@@ -222,8 +278,29 @@ _overlapped_CreateEvent(PyObject *module, PyObject *const *args, Py_ssize_t narg
     BOOL InitialState;
     const Py_UNICODE *Name;
 
-    if (!_PyArg_ParseStack(args, nargs, "OiiO&:CreateEvent",
-        &EventAttributes, &ManualReset, &InitialState, _PyUnicode_WideCharString_Opt_Converter, &Name)) {
+    if (!_PyArg_CheckPositional("CreateEvent", nargs, 4, 4)) {
+        goto exit;
+    }
+    EventAttributes = args[0];
+    ManualReset = _PyLong_AsInt(args[1]);
+    if (ManualReset == -1 && PyErr_Occurred()) {
+        goto exit;
+    }
+    InitialState = _PyLong_AsInt(args[2]);
+    if (InitialState == -1 && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (args[3] == Py_None) {
+        Name = NULL;
+    }
+    else if (PyUnicode_Check(args[3])) {
+        Name = PyUnicode_AsWideCharString(args[3], NULL);
+        if (Name == NULL) {
+            goto exit;
+        }
+    }
+    else {
+        _PyArg_BadArgument("CreateEvent", "argument 4", "str or None", args[3]);
         goto exit;
     }
     return_value = _overlapped_CreateEvent_impl(module, EventAttributes, ManualReset, InitialState, Name);
@@ -253,7 +330,8 @@ _overlapped_SetEvent(PyObject *module, PyObject *arg)
     PyObject *return_value = NULL;
     HANDLE Handle;
 
-    if (!PyArg_Parse(arg, ""F_HANDLE":SetEvent", &Handle)) {
+    Handle = PyLong_AsVoidPtr(arg);
+    if (!Handle && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_SetEvent_impl(module, Handle);
@@ -280,7 +358,8 @@ _overlapped_ResetEvent(PyObject *module, PyObject *arg)
     PyObject *return_value = NULL;
     HANDLE Handle;
 
-    if (!PyArg_Parse(arg, ""F_HANDLE":ResetEvent", &Handle)) {
+    Handle = PyLong_AsVoidPtr(arg);
+    if (!Handle && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_ResetEvent_impl(module, Handle);
@@ -310,8 +389,15 @@ _overlapped_BindLocal(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     HANDLE Socket;
     int Family;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"i:BindLocal",
-        &Socket, &Family)) {
+    if (!_PyArg_CheckPositional("BindLocal", nargs, 2, 2)) {
+        goto exit;
+    }
+    Socket = PyLong_AsVoidPtr(args[0]);
+    if (!Socket && PyErr_Occurred()) {
+        goto exit;
+    }
+    Family = _PyLong_AsInt(args[1]);
+    if (Family == -1 && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_BindLocal_impl(module, Socket, Family);
@@ -338,7 +424,7 @@ _overlapped_FormatMessage(PyObject *module, PyObject *arg)
     PyObject *return_value = NULL;
     DWORD code;
 
-    if (!PyArg_Parse(arg, "k:FormatMessage", &code)) {
+    if (!_PyLong_UnsignedLong_Converter(arg, &code)) {
         goto exit;
     }
     return_value = _overlapped_FormatMessage_impl(module, code);
@@ -361,13 +447,25 @@ _overlapped_Overlapped(PyTypeObject *type, PyObject *args, PyObject *kwargs)
 {
     PyObject *return_value = NULL;
     static const char * const _keywords[] = {"event", NULL};
-    static _PyArg_Parser _parser = {"|"F_HANDLE":Overlapped", _keywords, 0};
+    static _PyArg_Parser _parser = {NULL, _keywords, "Overlapped", 0};
+    PyObject *argsbuf[1];
+    PyObject * const *fastargs;
+    Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+    Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
     HANDLE event = INVALID_HANDLE_VALUE;
 
-    if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
-        &event)) {
+    fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf);
+    if (!fastargs) {
+        goto exit;
+    }
+    if (!noptargs) {
+        goto skip_optional_pos;
+    }
+    event = PyLong_AsVoidPtr(fastargs[0]);
+    if (!event && PyErr_Occurred()) {
         goto exit;
     }
+skip_optional_pos:
     return_value = _overlapped_Overlapped_impl(type, event);
 
 exit:
@@ -413,10 +511,17 @@ _overlapped_Overlapped_getresult(OverlappedObject *self, PyObject *const *args,
     PyObject *return_value = NULL;
     BOOL wait = FALSE;
 
-    if (!_PyArg_ParseStack(args, nargs, "|i:getresult",
-        &wait)) {
+    if (!_PyArg_CheckPositional("getresult", nargs, 0, 1)) {
+        goto exit;
+    }
+    if (nargs < 1) {
+        goto skip_optional;
+    }
+    wait = _PyLong_AsInt(args[0]);
+    if (wait == -1 && PyErr_Occurred()) {
         goto exit;
     }
+skip_optional:
     return_value = _overlapped_Overlapped_getresult_impl(self, wait);
 
 exit:
@@ -443,8 +548,14 @@ _overlapped_Overlapped_ReadFile(OverlappedObject *self, PyObject *const *args, P
     HANDLE handle;
     DWORD size;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"k:ReadFile",
-        &handle, &size)) {
+    if (!_PyArg_CheckPositional("ReadFile", nargs, 2, 2)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[1], &size)) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_ReadFile_impl(self, handle, size);
@@ -473,8 +584,18 @@ _overlapped_Overlapped_ReadFileInto(OverlappedObject *self, PyObject *const *arg
     HANDLE handle;
     Py_buffer bufobj = {NULL, NULL};
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"y*:ReadFileInto",
-        &handle, &bufobj)) {
+    if (!_PyArg_CheckPositional("ReadFileInto", nargs, 2, 2)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (PyObject_GetBuffer(args[1], &bufobj, PyBUF_SIMPLE) != 0) {
+        goto exit;
+    }
+    if (!PyBuffer_IsContiguous(&bufobj, 'C')) {
+        _PyArg_BadArgument("ReadFileInto", "argument 2", "contiguous buffer", args[1]);
         goto exit;
     }
     return_value = _overlapped_Overlapped_ReadFileInto_impl(self, handle, &bufobj);
@@ -509,10 +630,23 @@ _overlapped_Overlapped_WSARecv(OverlappedObject *self, PyObject *const *args, Py
     DWORD size;
     DWORD flags = 0;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"k|k:WSARecv",
-        &handle, &size, &flags)) {
+    if (!_PyArg_CheckPositional("WSARecv", nargs, 2, 3)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[1], &size)) {
         goto exit;
     }
+    if (nargs < 3) {
+        goto skip_optional;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &flags)) {
+        goto exit;
+    }
+skip_optional:
     return_value = _overlapped_Overlapped_WSARecv_impl(self, handle, size, flags);
 
 exit:
@@ -541,8 +675,21 @@ _overlapped_Overlapped_WSARecvInto(OverlappedObject *self, PyObject *const *args
     Py_buffer bufobj = {NULL, NULL};
     DWORD flags;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"y*k:WSARecvInto",
-        &handle, &bufobj, &flags)) {
+    if (!_PyArg_CheckPositional("WSARecvInto", nargs, 3, 3)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (PyObject_GetBuffer(args[1], &bufobj, PyBUF_SIMPLE) != 0) {
+        goto exit;
+    }
+    if (!PyBuffer_IsContiguous(&bufobj, 'C')) {
+        _PyArg_BadArgument("WSARecvInto", "argument 2", "contiguous buffer", args[1]);
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &flags)) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_WSARecvInto_impl(self, handle, &bufobj, flags);
@@ -576,8 +723,18 @@ _overlapped_Overlapped_WriteFile(OverlappedObject *self, PyObject *const *args,
     HANDLE handle;
     Py_buffer bufobj = {NULL, NULL};
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"y*:WriteFile",
-        &handle, &bufobj)) {
+    if (!_PyArg_CheckPositional("WriteFile", nargs, 2, 2)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (PyObject_GetBuffer(args[1], &bufobj, PyBUF_SIMPLE) != 0) {
+        goto exit;
+    }
+    if (!PyBuffer_IsContiguous(&bufobj, 'C')) {
+        _PyArg_BadArgument("WriteFile", "argument 2", "contiguous buffer", args[1]);
         goto exit;
     }
     return_value = _overlapped_Overlapped_WriteFile_impl(self, handle, &bufobj);
@@ -612,8 +769,21 @@ _overlapped_Overlapped_WSASend(OverlappedObject *self, PyObject *const *args, Py
     Py_buffer bufobj = {NULL, NULL};
     DWORD flags;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"y*k:WSASend",
-        &handle, &bufobj, &flags)) {
+    if (!_PyArg_CheckPositional("WSASend", nargs, 3, 3)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (PyObject_GetBuffer(args[1], &bufobj, PyBUF_SIMPLE) != 0) {
+        goto exit;
+    }
+    if (!PyBuffer_IsContiguous(&bufobj, 'C')) {
+        _PyArg_BadArgument("WSASend", "argument 2", "contiguous buffer", args[1]);
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &flags)) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_WSASend_impl(self, handle, &bufobj, flags);
@@ -648,8 +818,15 @@ _overlapped_Overlapped_AcceptEx(OverlappedObject *self, PyObject *const *args, P
     HANDLE ListenSocket;
     HANDLE AcceptSocket;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE""F_HANDLE":AcceptEx",
-        &ListenSocket, &AcceptSocket)) {
+    if (!_PyArg_CheckPositional("AcceptEx", nargs, 2, 2)) {
+        goto exit;
+    }
+    ListenSocket = PyLong_AsVoidPtr(args[0]);
+    if (!ListenSocket && PyErr_Occurred()) {
+        goto exit;
+    }
+    AcceptSocket = PyLong_AsVoidPtr(args[1]);
+    if (!AcceptSocket && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_AcceptEx_impl(self, ListenSocket, AcceptSocket);
@@ -681,10 +858,18 @@ _overlapped_Overlapped_ConnectEx(OverlappedObject *self, PyObject *const *args,
     HANDLE ConnectSocket;
     PyObject *AddressObj;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"O!:ConnectEx",
-        &ConnectSocket, &PyTuple_Type, &AddressObj)) {
+    if (!_PyArg_CheckPositional("ConnectEx", nargs, 2, 2)) {
+        goto exit;
+    }
+    ConnectSocket = PyLong_AsVoidPtr(args[0]);
+    if (!ConnectSocket && PyErr_Occurred()) {
         goto exit;
     }
+    if (!PyTuple_Check(args[1])) {
+        _PyArg_BadArgument("ConnectEx", "argument 2", "tuple", args[1]);
+        goto exit;
+    }
+    AddressObj = args[1];
     return_value = _overlapped_Overlapped_ConnectEx_impl(self, ConnectSocket, AddressObj);
 
 exit:
@@ -710,8 +895,14 @@ _overlapped_Overlapped_DisconnectEx(OverlappedObject *self, PyObject *const *arg
     HANDLE Socket;
     DWORD flags;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"k:DisconnectEx",
-        &Socket, &flags)) {
+    if (!_PyArg_CheckPositional("DisconnectEx", nargs, 2, 2)) {
+        goto exit;
+    }
+    Socket = PyLong_AsVoidPtr(args[0]);
+    if (!Socket && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[1], &flags)) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_DisconnectEx_impl(self, Socket, flags);
@@ -749,8 +940,30 @@ _overlapped_Overlapped_TransmitFile(OverlappedObject *self, PyObject *const *arg
     DWORD count_per_send;
     DWORD flags;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE""F_HANDLE"kkkkk:TransmitFile",
-        &Socket, &File, &offset, &offset_high, &count_to_write, &count_per_send, &flags)) {
+    if (!_PyArg_CheckPositional("TransmitFile", nargs, 7, 7)) {
+        goto exit;
+    }
+    Socket = PyLong_AsVoidPtr(args[0]);
+    if (!Socket && PyErr_Occurred()) {
+        goto exit;
+    }
+    File = PyLong_AsVoidPtr(args[1]);
+    if (!File && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &offset)) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[3], &offset_high)) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[4], &count_to_write)) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[5], &count_per_send)) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[6], &flags)) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_TransmitFile_impl(self, Socket, File, offset, offset_high, count_to_write, count_per_send, flags);
@@ -778,7 +991,8 @@ _overlapped_Overlapped_ConnectNamedPipe(OverlappedObject *self, PyObject *arg)
     PyObject *return_value = NULL;
     HANDLE Pipe;
 
-    if (!PyArg_Parse(arg, ""F_HANDLE":ConnectNamedPipe", &Pipe)) {
+    Pipe = PyLong_AsVoidPtr(arg);
+    if (!Pipe && PyErr_Occurred()) {
         goto exit;
     }
     return_value = _overlapped_Overlapped_ConnectNamedPipe_impl(self, Pipe);
@@ -843,10 +1057,14 @@ _overlapped_WSAConnect(PyObject *module, PyObject *const *args, Py_ssize_t nargs
     HANDLE ConnectSocket;
     PyObject *AddressObj;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"O:WSAConnect",
-        &ConnectSocket, &AddressObj)) {
+    if (!_PyArg_CheckPositional("WSAConnect", nargs, 2, 2)) {
+        goto exit;
+    }
+    ConnectSocket = PyLong_AsVoidPtr(args[0]);
+    if (!ConnectSocket && PyErr_Occurred()) {
         goto exit;
     }
+    AddressObj = args[1];
     return_value = _overlapped_WSAConnect_impl(module, ConnectSocket, AddressObj);
 
 exit:
@@ -876,10 +1094,24 @@ _overlapped_Overlapped_WSASendTo(OverlappedObject *self, PyObject *const *args,
     DWORD flags;
     PyObject *AddressObj;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"y*kO:WSASendTo",
-        &handle, &bufobj, &flags, &AddressObj)) {
+    if (!_PyArg_CheckPositional("WSASendTo", nargs, 4, 4)) {
         goto exit;
     }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (PyObject_GetBuffer(args[1], &bufobj, PyBUF_SIMPLE) != 0) {
+        goto exit;
+    }
+    if (!PyBuffer_IsContiguous(&bufobj, 'C')) {
+        _PyArg_BadArgument("WSASendTo", "argument 2", "contiguous buffer", args[1]);
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &flags)) {
+        goto exit;
+    }
+    AddressObj = args[3];
     return_value = _overlapped_Overlapped_WSASendTo_impl(self, handle, &bufobj, flags, AddressObj);
 
 exit:
@@ -913,10 +1145,23 @@ _overlapped_Overlapped_WSARecvFrom(OverlappedObject *self, PyObject *const *args
     DWORD size;
     DWORD flags = 0;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"k|k:WSARecvFrom",
-        &handle, &size, &flags)) {
+    if (!_PyArg_CheckPositional("WSARecvFrom", nargs, 2, 3)) {
         goto exit;
     }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[1], &size)) {
+        goto exit;
+    }
+    if (nargs < 3) {
+        goto skip_optional;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &flags)) {
+        goto exit;
+    }
+skip_optional:
     return_value = _overlapped_Overlapped_WSARecvFrom_impl(self, handle, size, flags);
 
 exit:
@@ -946,10 +1191,30 @@ _overlapped_Overlapped_WSARecvFromInto(OverlappedObject *self, PyObject *const *
     DWORD size;
     DWORD flags = 0;
 
-    if (!_PyArg_ParseStack(args, nargs, ""F_HANDLE"y*k|k:WSARecvFromInto",
-        &handle, &bufobj, &size, &flags)) {
+    if (!_PyArg_CheckPositional("WSARecvFromInto", nargs, 3, 4)) {
+        goto exit;
+    }
+    handle = PyLong_AsVoidPtr(args[0]);
+    if (!handle && PyErr_Occurred()) {
+        goto exit;
+    }
+    if (PyObject_GetBuffer(args[1], &bufobj, PyBUF_SIMPLE) != 0) {
+        goto exit;
+    }
+    if (!PyBuffer_IsContiguous(&bufobj, 'C')) {
+        _PyArg_BadArgument("WSARecvFromInto", "argument 2", "contiguous buffer", args[1]);
+        goto exit;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[2], &size)) {
+        goto exit;
+    }
+    if (nargs < 4) {
+        goto skip_optional;
+    }
+    if (!_PyLong_UnsignedLong_Converter(args[3], &flags)) {
         goto exit;
     }
+skip_optional:
     return_value = _overlapped_Overlapped_WSARecvFromInto_impl(self, handle, &bufobj, size, flags);
 
 exit:
@@ -960,4 +1225,4 @@ _overlapped_Overlapped_WSARecvFromInto(OverlappedObject *self, PyObject *const *
 
     return return_value;
 }
-/*[clinic end generated code: output=9078d9f9984864a2 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d90cda84e49a7c23 input=a9049054013a1b77]*/
diff --git a/Modules/overlapped.c b/Modules/overlapped.c
index 19d25a53af7bb..0cec9eedc87f0 100644
--- a/Modules/overlapped.c
+++ b/Modules/overlapped.c
@@ -32,27 +32,33 @@
 #define T_HANDLE T_POINTER
 
 /*[python input]
-class OVERLAPPED_converter(CConverter):
-    type = 'OVERLAPPED *'
+class pointer_converter(CConverter):
     format_unit = '"F_POINTER"'
 
-class HANDLE_converter(CConverter):
+    def parse_arg(self, argname, displayname):
+        return """
+            {paramname} = PyLong_AsVoidPtr({argname});
+            if (!{paramname} && PyErr_Occurred()) {{{{
+                goto exit;
+            }}}}
+            """.format(argname=argname, paramname=self.parser_name)
+
+class OVERLAPPED_converter(pointer_converter):
+    type = 'OVERLAPPED *'
+
+class HANDLE_converter(pointer_converter):
     type = 'HANDLE'
-    format_unit = '"F_HANDLE"'
 
-class ULONG_PTR_converter(CConverter):
+class ULONG_PTR_converter(pointer_converter):
     type = 'ULONG_PTR'
-    format_unit = '"F_ULONG_PTR"'
 
-class DWORD_converter(CConverter):
+class DWORD_converter(unsigned_long_converter):
     type = 'DWORD'
-    format_unit = 'k'
 
-class BOOL_converter(CConverter):
+class BOOL_converter(int_converter):
     type = 'BOOL'
-    format_unit = 'i'
 [python start generated code]*/
-/*[python end generated code: output=da39a3ee5e6b4b0d input=83bb8c2c2514f2a8]*/
+/*[python end generated code: output=da39a3ee5e6b4b0d input=a19133a9e14fae9c]*/
 
 /*[clinic input]
 module _overlapped



More information about the Python-checkins mailing list