From 11c639e3bd2ca3e6a87f349155dda2acc3cd92ea Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Wed, 14 Dec 2011 13:54:31 -0500 Subject: Add error checking to dbus_py_variant_level_get() and call sites. --- _dbus_bindings/abstract.c | 22 +++++++++++++++++++--- _dbus_bindings/containers.c | 4 ++++ _dbus_bindings/message-append.c | 4 ++++ 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; } -- cgit v1.2.1