From 187f47e947d1e0f4547e58b7cc4fad4d5542b185 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 24 Jun 2017 12:10:07 -0600 Subject: [PATCH 1/3] qobject: Catch another straggler for use of qdict_put_str() Dan's addition of key-secret improvements in commit 29cf9336 was developed prior to the addition of QDict scalar insertion macros, but merged after the general cleanup in commit 46f5ac20. Patch created mechanically by rerunning: spatch --sp-file scripts/coccinelle/qobject.cocci \ --macro-file scripts/cocci-macro-file.h --dir . --in-place Signed-off-by: Eric Blake Reviewed-by: Alberto Garcia Message-Id: <20170624181008.25497-2-eblake@redhat.com> Reviewed-by: Max Reitz Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- qemu-img.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qemu-img.c b/qemu-img.c index f7ffb79db6..02900ce1d1 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -355,7 +355,7 @@ static int img_add_key_secrets(void *opaque, QDict *options = opaque; if (g_str_has_suffix(name, "key-secret")) { - qdict_put(options, name, qstring_from_str(value)); + qdict_put_str(options, name, value); } return 0; From 8a4613a0ab4b6e9271e64aaa88f588ed1b749eb4 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 24 Jun 2017 12:10:08 -0600 Subject: [PATCH 2/3] qobject: Update coccinelle script to catch Q{INC, DEC}REF The recent commit b097efc0 used qobject_decref(QOBJECT(E)), even though we already have QDECREF(E) for that purpose. We can update our coccinelle script to catch any future relapses; with that in place, the rest of the patch is generated with: spatch --sp-file scripts/coccinelle/qobject.cocci \ --macro-file scripts/cocci-macro-file.h --dir . --in-place Signed-off-by: Eric Blake Message-Id: <20170624181008.25497-3-eblake@redhat.com> Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- monitor.c | 2 +- scripts/coccinelle/qobject.cocci | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/monitor.c b/monitor.c index d8ac20f6ca..61b7982678 100644 --- a/monitor.c +++ b/monitor.c @@ -3842,7 +3842,7 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens) req_json = qobject_to_json(req); trace_handle_qmp_command(mon, qstring_get_str(req_json)); - qobject_decref(QOBJECT(req_json)); + QDECREF(req_json); rsp = qmp_dispatch(cur_mon->qmp.commands, req); diff --git a/scripts/coccinelle/qobject.cocci b/scripts/coccinelle/qobject.cocci index c3253deb1b..c518caf7b1 100644 --- a/scripts/coccinelle/qobject.cocci +++ b/scripts/coccinelle/qobject.cocci @@ -3,6 +3,12 @@ expression Obj, Key, E; @@ ( +- qobject_incref(QOBJECT(E)); ++ QINCREF(E); +| +- qobject_decref(QOBJECT(E)); ++ QDECREF(E); +| - qdict_put_obj(Obj, Key, QOBJECT(E)); + qdict_put(Obj, Key, E); | From 086ee7a6200fa5ad795b12110b5b3d5a93dcac3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 1 Jun 2017 16:41:41 +0400 Subject: [PATCH 3/3] scripts: use build_ prefix for string not piped through cgen() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gen_ prefix is awkward. Generated C should go through cgen() exactly once (see commit 1f9a7a1). The common way to get this wrong is passing a foo=gen_foo() keyword argument to mcgen(). I'd like us to adopt a naming convention where gen_ means "something that's been piped through cgen(), and thus must not be passed to cgen() or mcgen()". Requires renaming gen_params(), gen_marshal_proto() and gen_event_send_proto(). Suggested-by: Markus Armbruster Signed-off-by: Marc-André Lureau Message-Id: <20170601124143.10915-1-marcandre.lureau@redhat.com> Reviewed-by: Eric Blake Signed-off-by: Markus Armbruster --- scripts/qapi-commands.py | 8 ++++---- scripts/qapi-event.py | 12 ++++++------ scripts/qapi.py | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 1943de4852..974d0a4a80 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -21,7 +21,7 @@ def gen_command_decl(name, arg_type, boxed, ret_type): ''', c_type=(ret_type and ret_type.c_type()) or 'void', c_name=c_name(name), - params=gen_params(arg_type, boxed, 'Error **errp')) + params=build_params(arg_type, boxed, 'Error **errp')) def gen_call(name, arg_type, boxed, ret_type): @@ -82,7 +82,7 @@ static void qmp_marshal_output_%(c_name)s(%(c_type)s ret_in, QObject **ret_out, c_type=ret_type.c_type(), c_name=ret_type.c_name()) -def gen_marshal_proto(name): +def build_marshal_proto(name): return ('void qmp_marshal_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name)) @@ -91,7 +91,7 @@ def gen_marshal_decl(name): return mcgen(''' %(proto)s; ''', - proto=gen_marshal_proto(name)) + proto=build_marshal_proto(name)) def gen_marshal(name, arg_type, boxed, ret_type): @@ -103,7 +103,7 @@ def gen_marshal(name, arg_type, boxed, ret_type): { Error *err = NULL; ''', - proto=gen_marshal_proto(name)) + proto=build_marshal_proto(name)) if ret_type: ret += mcgen(''' diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py index 0485e39145..bcbef1035f 100644 --- a/scripts/qapi-event.py +++ b/scripts/qapi-event.py @@ -14,10 +14,10 @@ from qapi import * -def gen_event_send_proto(name, arg_type, boxed): +def build_event_send_proto(name, arg_type, boxed): return 'void qapi_event_send_%(c_name)s(%(param)s)' % { 'c_name': c_name(name.lower()), - 'param': gen_params(arg_type, boxed, 'Error **errp')} + 'param': build_params(arg_type, boxed, 'Error **errp')} def gen_event_send_decl(name, arg_type, boxed): @@ -25,10 +25,10 @@ def gen_event_send_decl(name, arg_type, boxed): %(proto)s; ''', - proto=gen_event_send_proto(name, arg_type, boxed)) + proto=build_event_send_proto(name, arg_type, boxed)) -# Declare and initialize an object 'qapi' using parameters from gen_params() +# Declare and initialize an object 'qapi' using parameters from build_params() def gen_param_var(typ): assert not typ.variants ret = mcgen(''' @@ -42,7 +42,7 @@ def gen_param_var(typ): if memb.optional: ret += 'has_' + c_name(memb.name) + sep if memb.type.name == 'str': - # Cast away const added in gen_params() + # Cast away const added in build_params() ret += '(char *)' ret += c_name(memb.name) ret += mcgen(''' @@ -72,7 +72,7 @@ def gen_event_send(name, arg_type, boxed): Error *err = NULL; QMPEventFuncEmit emit; ''', - proto=gen_event_send_proto(name, arg_type, boxed)) + proto=build_event_send_proto(name, arg_type, boxed)) if arg_type and not arg_type.is_empty(): ret += mcgen(''' diff --git a/scripts/qapi.py b/scripts/qapi.py index 0de809f56b..84e2eb441b 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -1897,7 +1897,7 @@ extern const char *const %(c_name)s_lookup[]; return ret -def gen_params(arg_type, boxed, extra): +def build_params(arg_type, boxed, extra): if not arg_type: assert not boxed return extra