Skip to content

Commit

Permalink
[3.12] gh-105375: Improve error handling in _ctypes (GH-105593) (#105663
Browse files Browse the repository at this point in the history
)

Prevent repeated PyLong_FromVoidPtr() from possibly overwriting the
current exception.
(cherry picked from commit e8998e4)

Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
  • Loading branch information
miss-islington and erlend-aasland committed Jun 11, 2023
1 parent ed03895 commit 82ac2be
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
@@ -0,0 +1 @@
Fix bugs in :mod:`_ctypes` where exceptions could end up being overwritten.
18 changes: 14 additions & 4 deletions Modules/_ctypes/callbacks.c
Expand Up @@ -479,12 +479,22 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)

{
PyObject *py_rclsid = PyLong_FromVoidPtr((void *)rclsid);
if (py_rclsid == NULL) {
Py_DECREF(func);
PyErr_WriteUnraisable(context ? context : Py_None);
return E_FAIL;
}
PyObject *py_riid = PyLong_FromVoidPtr((void *)riid);
if (py_riid == NULL) {
Py_DECREF(func);
Py_DECREF(py_rclsid);
PyErr_WriteUnraisable(context ? context : Py_None);
return E_FAIL;
}
PyObject *py_ppv = PyLong_FromVoidPtr(ppv);
if (!py_rclsid || !py_riid || !py_ppv) {
Py_XDECREF(py_rclsid);
Py_XDECREF(py_riid);
Py_XDECREF(py_ppv);
if (py_ppv == NULL) {
Py_DECREF(py_rclsid);
Py_DECREF(py_riid);
Py_DECREF(func);
PyErr_WriteUnraisable(context ? context : Py_None);
return E_FAIL;
Expand Down

0 comments on commit 82ac2be

Please sign in to comment.