From: Mark Wooding Date: Sun, 24 Nov 2019 15:07:08 +0000 (+0000) Subject: util.c (mkexc): Populate dictionary before constructing exception class. X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/commitdiff_plain/80622b5a78dcb17098d8765857d89824ad8417e4?ds=sidebyside;hp=5ca4bdf47d4d7a2399a53f2d62725f03381e0a7a util.c (mkexc): Populate dictionary before constructing exception class. It turns out that the dictionary contents are copied into the new class rather than being used by reference, so populating it later doesn't actually do anything. --- diff --git a/util.c b/util.c index 9332c8b..29f7d12 100644 --- a/util.c +++ b/util.c @@ -324,13 +324,7 @@ PyObject *mkexc(PyObject *mod, PyObject *base, PyObject *func = 0; PyObject *meth = 0; - if ((nameobj = PyString_FromFormat("%s.%s", - PyModule_GetName(mod), - name)) == 0 || - (dict = PyDict_New()) == 0 || - (exc = PyErr_NewException(PyString_AS_STRING(nameobj), - base, dict)) == 0) - goto fail; + if ((dict = PyDict_New()) == 0) goto fail; if (mm) { while (mm->ml_name) { @@ -344,6 +338,13 @@ PyObject *mkexc(PyObject *mod, PyObject *base, } } + if ((nameobj = PyString_FromFormat("%s.%s", + PyModule_GetName(mod), + name)) == 0 || + (exc = PyErr_NewException(PyString_AS_STRING(nameobj), + base, dict)) == 0) + goto fail; + done: Py_XDECREF(nameobj); Py_XDECREF(dict);