summaryrefslogtreecommitdiff
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
parent71f4481c1876785572170ef68d5624ed23f91333 (diff)
downloaddbus-python-11c639e3bd2ca3e6a87f349155dda2acc3cd92ea.tar.gz
Add error checking to dbus_py_variant_level_get() and call sites.
-rw-r--r--_dbus_bindings/abstract.c22
-rw-r--r--_dbus_bindings/containers.c4
-rw-r--r--_dbus_bindings/message-append.c4
3 files changed, 27 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
diff --git a/_dbus_bindings/containers.c b/_dbus_bindings/containers.c
index f74476c..86a7675 100644
--- a/_dbus_bindings/containers.c
+++ b/_dbus_bindings/containers.c
@@ -519,7 +519,11 @@ Struct_tp_repr(PyObject *self)
if (!sig) sig = Py_None;
sig_repr = PyObject_Repr(sig);
if (!sig_repr) goto finally;
+
variant_level = dbus_py_variant_level_get(self);
+ if (variant_level < 0)
+ goto finally;
+
if (variant_level > 0) {
my_repr = PyUnicode_FromFormat("%s(%V, signature=%V, "
"variant_level=%ld)",
diff --git a/_dbus_bindings/message-append.c b/_dbus_bindings/message-append.c
index 587195f..ea12a7d 100644
--- a/_dbus_bindings/message-append.c
+++ b/_dbus_bindings/message-append.c
@@ -171,6 +171,10 @@ _signature_string_from_pyobject(PyObject *obj, long *variant_level_ptr)
{
PyObject *magic_attr;
long variant_level = get_variant_level(obj);
+
+ if (variant_level < 0)
+ return NULL;
+
if (variant_level_ptr) {
*variant_level_ptr = variant_level;
}