diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-12-06 20:32:58 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-12-06 20:32:58 (GMT) |
commit | 358a098d35d2036c10634e0f12d5c5812641352f (patch) | |
tree | da90afd9521d39fadb5c2e90c9a7fc605f57d8da /plugins/pychrysalide | |
parent | 9a76c53c8e8808c46aaa61914f625e29a7b6cc58 (diff) |
Fortified the Python plugin interface loading.
Diffstat (limited to 'plugins/pychrysalide')
-rw-r--r-- | plugins/pychrysalide/plugin.c | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c index 0fd6c26..495cecf 100644 --- a/plugins/pychrysalide/plugin.c +++ b/plugins/pychrysalide/plugin.c @@ -317,25 +317,28 @@ static int py_plugin_module_init(PyObject *self, PyObject *args, PyObject *kwds) iface = calloc(1, sizeof(plugin_interface)); plugin->interface = iface; -#define LOAD_PYTHON_IFACE(attr) \ - do \ - { \ - if (PyObject_HasAttrString(self, "_" #attr)) \ - { \ - value = PyObject_GetAttrString(self, "_" #attr); \ - if (value != NULL) \ - { \ - if (PyUnicode_Check(value)) \ - iface->attr = strdup(PyUnicode_AsUTF8(value)); \ - Py_DECREF(value); \ - } \ - } \ - if (iface->attr == NULL) \ - { \ - PyErr_SetString(PyExc_TypeError, _("A '_" #attr "' class attributes is missing.")); \ - return -1; \ - } \ - } \ +#define LOAD_PYTHON_IFACE(attr) \ + do \ + { \ + value = PyObject_GetAttrString(self, "_" #attr); \ + if (value == NULL) \ + { \ + PyErr_SetString(PyExc_TypeError, _("A '_" #attr "' class attributes is missing.")); \ + return -1; \ + } \ + if (PyUnicode_Check(value)) \ + { \ + iface->attr = strdup(PyUnicode_AsUTF8(value)); \ + Py_DECREF(value); \ + } \ + else \ + { \ + Py_DECREF(value); \ + PyErr_SetString(PyExc_TypeError, _("The '_" #attr "' class attributes must be a string.")); \ + return -1; \ + } \ + assert(iface->attr != NULL); \ + } \ while (0); LOAD_PYTHON_IFACE(name); @@ -349,12 +352,18 @@ static int py_plugin_module_init(PyObject *self, PyObject *args, PyObject *kwds) iface->required[0] = "PyChrysalide"; iface->required_count = 1; - if (PyObject_HasAttrString(self, "_actions")) - value = PyObject_GetAttrString(self, "_actions"); + value = PyObject_GetAttrString(self, "_actions"); - else + if (value == NULL) + { + PyErr_SetString(PyExc_TypeError, _("An '_actions' class attributes is missing.")); + return -1; + } + + if (!PyTuple_Check(value)) { - PyErr_SetString(PyExc_TypeError, _("A '_actions' class attributes is missing.")); + Py_DECREF(value); + PyErr_SetString(PyExc_TypeError, _("The '_actions' class attributes must be a tuple.")); return -1; } @@ -367,6 +376,7 @@ static int py_plugin_module_init(PyObject *self, PyObject *args, PyObject *kwds) if (!PyLong_Check(action)) { + Py_DECREF(value); PyErr_SetString(PyExc_TypeError, _("invalid type for plugin action.")); return -1; } @@ -375,6 +385,8 @@ static int py_plugin_module_init(PyObject *self, PyObject *args, PyObject *kwds) } + Py_DECREF(value); + return 0; } |