diff options
| author | Barry Warsaw <barry@python.org> | 2011-12-14 13:54:31 -0500 |
|---|---|---|
| committer | Barry Warsaw <barry@python.org> | 2011-12-14 13:54:31 -0500 |
| commit | 11c639e3bd2ca3e6a87f349155dda2acc3cd92ea (patch) | |
| tree | d6c9e61d91e056d13666564b6d1471d7229147a2 /_dbus_bindings/abstract.c | |
| parent | 71f4481c1876785572170ef68d5624ed23f91333 (diff) | |
| download | dbus-python-11c639e3bd2ca3e6a87f349155dda2acc3cd92ea.tar.gz | |
Add error checking to dbus_py_variant_level_get() and call sites.
Diffstat (limited to '_dbus_bindings/abstract.c')
| -rw-r--r-- | _dbus_bindings/abstract.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/_dbus_bindings/abstract.c b/_dbus_bindings/abstract.c index af2ea8e..3fdf286 100644 --- a/_dbus_bindings/abstract.c +++ b/_dbus_bindings/abstract.c @@ -44,17 +44,33 @@ dbus_py_variant_level_get(PyObject *obj) { PyObject *vl_obj; PyObject *key = PyLong_FromVoidPtr(obj); + long variant_level; if (!key) { - return 0; + return -1; } vl_obj = PyDict_GetItem(_dbus_py_variant_levels, key); Py_CLEAR(key); - if (!vl_obj) + if (!vl_obj) { + /* PyDict_GetItem() does not set an exception when the key is missing. + * In our case, it just means that there was no entry in the variant + * dictionary for this object. Semantically, this is equivalent to a + * variant level of 0. + */ return 0; - return PyInt_AsLong(vl_obj); + } + variant_level = PyInt_AsLong(vl_obj); + if (variant_level == -1 && PyErr_Occurred()) { + /* variant_level < 0 can never be inserted into the dictionary; see + * dbus_py_variant_level_set() below. The semantics of setting + * variant_level < 0 is to delete it from the dictionary. + */ + return -1; + } + assert(variant_level >= 0); + return variant_level; } dbus_bool_t |
