Prevent repeated PyLong_FromVoidPtr() from possibly overwriting the
current exception.
(cherry picked from commit
e8998e46a7ce8ad336e0941a6da6e50cb88d1e47)
Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
--- /dev/null
+Fix bugs in :mod:`_ctypes` where exceptions could end up being overwritten.
{
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;