summaryrefslogtreecommitdiff
path: root/_dbus_bindings/abstract.c
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2011-12-14 13:54:31 -0500
committerBarry Warsaw <barry@python.org>2011-12-14 13:54:31 -0500
commit11c639e3bd2ca3e6a87f349155dda2acc3cd92ea (patch)
treed6c9e61d91e056d13666564b6d1471d7229147a2 /_dbus_bindings/abstract.c
parent71f4481c1876785572170ef68d5624ed23f91333 (diff)
downloaddbus-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.c22
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