From 11ea8ae1b2279566125978766735a26252dff412 Mon Sep 17 00:00:00 2001 From: Bert Vermeulen Date: Fri, 20 Jan 2012 22:23:27 +0100 Subject: [PATCH] srd: decoder class structure check belongs in module loader --- controller.c | 5 ----- decoder.c | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/controller.c b/controller.c index ebda088..fa67004 100644 --- a/controller.c +++ b/controller.c @@ -186,11 +186,6 @@ int srd_instance_set_options(struct srd_decoder_instance *di, py_dec_options = py_dec_optkeys = py_di_options = py_optval = NULL; py_optlist = py_classval = NULL; py_dec_options = PyObject_GetAttrString(di->decoder->py_dec, "options"); - if (!PyDict_Check(py_dec_options)) { - srd_err("Protocol decoder %s options is not a dictionary.", - di->decoder->name); - goto err_out; - } /* All of these are synthesized objects, so they're good. */ py_dec_optkeys = PyDict_Keys(py_dec_options); diff --git a/decoder.c b/decoder.c index 6651642..5b9223c 100644 --- a/decoder.c +++ b/decoder.c @@ -75,12 +75,12 @@ struct srd_decoder *srd_get_decoder_by_id(const char *id) */ int srd_load_decoder(const char *name, struct srd_decoder **dec) { - PyObject *py_basedec, *py_method, *py_annlist, *py_ann; + PyObject *py_basedec, *py_method, *py_attr, *py_annlist, *py_ann; struct srd_decoder *d; int alen, ret, i; char **ann; - py_basedec = py_method = NULL; + py_basedec = py_method = py_attr = NULL; srd_dbg("decoder: %s: loading module '%s'", __func__, name); @@ -150,6 +150,17 @@ int srd_load_decoder(const char *name, struct srd_decoder **dec) } Py_DecRef(py_method); + /* If present, options must be a dictionary. */ + if (PyObject_HasAttrString(d->py_dec, "options")) { + py_attr = PyObject_GetAttrString(d->py_dec, "options"); + if (!PyDict_Check(py_attr)) { + srd_err("Protocol decoder %s options attribute is not " + "a dictionary.", d->name); + goto err_out; + } + Py_DecRef(py_attr); + } + if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK) goto err_out; -- 2.30.2