Re: [Qemu-devel] [PATCH 07/14] Don't check qobject_type() before qobject_to_qdict()

2017-02-21 Thread Eric Blake
On 02/17/2017 02:38 PM, Markus Armbruster wrote:
> qobject_to_qdict(obj) returns NULL when obj isn't a QDict.  Check
> that instead of qobject_type(obj) == QTYPE_QDICT.
> 
> Signed-off-by: Markus Armbruster 
> ---

Reviewed-by: Eric Blake 

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


[Qemu-devel] [PATCH 07/14] Don't check qobject_type() before qobject_to_qdict()

2017-02-17 Thread Markus Armbruster
qobject_to_qdict(obj) returns NULL when obj isn't a QDict.  Check
that instead of qobject_type(obj) == QTYPE_QDICT.

Signed-off-by: Markus Armbruster 
---
 block.c |  4 ++--
 hw/pci/pcie_aer.c   |  2 +-
 monitor.c   | 10 -
 qapi/qmp-dispatch.c |  5 ++---
 tests/check-qdict.c |  9 ++--
 tests/test-qobject-output-visitor.c | 41 +++--
 6 files changed, 24 insertions(+), 47 deletions(-)

diff --git a/block.c b/block.c
index 743c349..3c36af5 100644
--- a/block.c
+++ b/block.c
@@ -1169,13 +1169,13 @@ static QDict *parse_json_filename(const char *filename, 
Error **errp)
 return NULL;
 }
 
-if (qobject_type(options_obj) != QTYPE_QDICT) {
+options = qobject_to_qdict(options_obj);
+if (!options) {
 qobject_decref(options_obj);
 error_setg(errp, "Invalid JSON object given");
 return NULL;
 }
 
-options = qobject_to_qdict(options_obj);
 qdict_flatten(options);
 
 return options;
diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c
index daf1f65..a8c1820 100644
--- a/hw/pci/pcie_aer.c
+++ b/hw/pci/pcie_aer.c
@@ -1025,8 +1025,8 @@ void hmp_pcie_aer_inject_error(Monitor *mon, const QDict 
*qdict)
 return;
 }
 
-assert(qobject_type(data) == QTYPE_QDICT);
 qdict = qobject_to_qdict(data);
+assert(qdict);
 
 devfn = (int)qdict_get_int(qdict, "devfn");
 monitor_printf(mon, "OK id: %s root bus: %s, bus: %x devfn: %x.%x\n",
diff --git a/monitor.c b/monitor.c
index 3cd72a9..493bed9 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3686,12 +3686,12 @@ static QDict *qmp_check_input_obj(QObject *input_obj, 
Error **errp)
 int has_exec_key = 0;
 QDict *input_dict;
 
-if (qobject_type(input_obj) != QTYPE_QDICT) {
-error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "object");
-return NULL;
-}
-
 input_dict = qobject_to_qdict(input_obj);
+if (!input_dict) {
+error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "object");
+return NULL;
+}
+
 
 for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, 
ent)){
 const char *arg_name = qdict_entry_key(ent);
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 505eb41..48bec20 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -28,14 +28,13 @@ static QDict *qmp_dispatch_check_obj(const QObject 
*request, Error **errp)
 bool has_exec_key = false;
 QDict *dict = NULL;
 
-if (qobject_type(request) != QTYPE_QDICT) {
+dict = qobject_to_qdict(request);
+if (!dict) {
 error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT,
"request is not a dictionary");
 return NULL;
 }
 
-dict = qobject_to_qdict(request);
-
 for (ent = qdict_first(dict); ent;
  ent = qdict_next(dict, ent)) {
 arg_name = qdict_entry_key(ent);
diff --git a/tests/check-qdict.c b/tests/check-qdict.c
index ded3a26..81162ee 100644
--- a/tests/check-qdict.c
+++ b/tests/check-qdict.c
@@ -591,7 +591,6 @@ static void qdict_join_test(void)
 static void qdict_crumple_test_recursive(void)
 {
 QDict *src, *dst, *rule, *vnc, *acl, *listen;
-QObject *res;
 QList *rules;
 
 src = qdict_new();
@@ -605,12 +604,8 @@ static void qdict_crumple_test_recursive(void)
 qdict_put(src, "vnc.acl..name", qstring_from_str("acl0"));
 qdict_put(src, "vnc.acl.rule..name", qstring_from_str("acl0"));
 
-res = qdict_crumple(src, _abort);
-
-g_assert_cmpint(qobject_type(res), ==, QTYPE_QDICT);
-
-dst = qobject_to_qdict(res);
-
+dst = qobject_to_qdict(qdict_crumple(src, _abort));
+g_assert(dst);
 g_assert_cmpint(qdict_size(dst), ==, 1);
 
 vnc = qdict_get_qdict(dst, "vnc");
diff --git a/tests/test-qobject-output-visitor.c 
b/tests/test-qobject-output-visitor.c
index 4e2d79c..a874386 100644
--- a/tests/test-qobject-output-visitor.c
+++ b/tests/test-qobject-output-visitor.c
@@ -160,15 +160,12 @@ static void test_visitor_out_struct(TestOutputVisitorData 
*data,
.boolean = false,
.string = (char *) "foo"};
 TestStruct *p = _struct;
-QObject *obj;
 QDict *qdict;
 
 visit_type_TestStruct(data->ov, NULL, , _abort);
 
-obj = visitor_get(data);
-g_assert(qobject_type(obj) == QTYPE_QDICT);
-
-qdict = qobject_to_qdict(obj);
+qdict = qobject_to_qdict(visitor_get(data));
+g_assert(qdict);
 g_assert_cmpint(qdict_size(qdict), ==, 3);
 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 42);
 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, false);
@@ -180,7 +177,6 @@ static void 
test_visitor_out_struct_nested(TestOutputVisitorData *data,
 {
 int64_t value = 42;
 UserDefTwo *ud2;
-QObject *obj;
 QDict *qdict, *dict1, *dict2, *dict3, *userdef;
 const char *string = "user def string";
 const