From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: Stefan Hajnoczi <stefanha@gmail.com>,
qemu-devel@nongnu.org, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v3 07/12] qtest: Add a new helper qmp_cmd() and friends
Date: Mon, 31 Jul 2017 10:16:39 +0200 [thread overview]
Message-ID: <871soxaumw.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <7e291686-0242-5bd3-8f83-00145be9d9ee@redhat.com> (Eric Blake's message of "Fri, 28 Jul 2017 11:33:03 -0500")
Eric Blake <eblake@redhat.com> writes:
> On 07/28/2017 08:06 AM, Eric Blake wrote:
>> On 07/28/2017 07:57 AM, Stefan Hajnoczi wrote:
>>> On Tue, Jul 25, 2017 at 04:15:18PM -0500, Eric Blake wrote:
>>>> +QDict *qtest_qmp_cmd(QTestState *s, const char *cmd, QObject *args)
>>>> +{
>>>> + QDict *dict = qdict_new();
>>>> +
>>>> + qdict_put_str(dict, "execute", cmd);
>>>> + if (args) {
>>>> + qdict_put_obj(dict, "arguments", args);
>>>> + }
>>>> + return qtest_qmp(s, "%p", QOBJECT(dict));
>>>> +}
>>>
>>> qtest_qmp(s, "%p", QOBJECT(dict)) takes ownership of dict?
>>
>> Hmm, I documented that for qtest_qmp_cmd(), but you have a good
>> question. I need to double-check that it is true for
>> qobject_from_jsonf("%p", obj), but my recollection is that yes, wrapping
>> one object inside the other means freeing the outer object also reclaims
>> the inner (that is, qobject_from_jsonf wasn't increasing refcount). At
>> any rate, I'll probably have to submit a followup patch (either to fix
>> the leak if I'm wrong, or to improve the documentation about %p
>> reference management if I'm right).
>
> $ valgrind --leak-check=full ./tests/check-qjson
> ...
> ==10596== LEAK SUMMARY:
> ==10596== definitely lost: 0 bytes in 0 blocks
> ...
> $ grep -C5 %p tests/check-qjson.c
> {}}));
>
> embedded_obj = qobject_from_json("[32, 42]", &error_abort);
> g_assert(embedded_obj != NULL);
>
> obj = qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj);
> g_assert(compare_litqobj_to_qobj(&decoded, obj) == 1);
>
> qobject_decref(obj);
> }
>
> So given the clean bill of health from valgrind, we definitely DO turn
> over responsibility for freeing on object to its new wrapper, once it is
> passed through %p. Documentation could be improved to make that clear.
>
> Eww, what happens if qobject_from_jsonf() can fail halfway through? If
> you mix %p with other stuff, how do you know on failure whether the
> reference was taken or not yet reached? Maybe the testsuite needs an
> enhancement.
What we actually need is qobject_from_jsonf() behaving sanely failure!
Either it takes over all references (just like on success) or none.
It delegates the part of its job that's relevant here to json-parser.c.
Looks like parse_escape() takes over the reference greedily. If parsing
fails, it's released along with all the refernces to objects the parser
built.
One way to do "none": delay taking over the reference until parsing
succeeded. Increment it in parse_escape(), decrement it in
json_parser_parse_err(). Either hold %p arguments in JSONParserContext,
so json_parser_parse_err() can find them easily, or iterate over @tokens
and @ap again.
One way to do "all": on error, have json_parser_parse_err() iterate over
remaining @tokens and @ap to consume references.
next prev parent reply other threads:[~2017-07-31 8:16 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-25 21:15 [Qemu-devel] [PATCH v3 00/12] Clean up around qmp() and hmp() Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 01/12] qobject: Accept "%"PRId64 in qobject_from_jsonf() Eric Blake
2017-07-28 18:13 ` Markus Armbruster
2017-07-28 18:56 ` Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 02/12] qtest: Avoid passing raw strings through hmp() Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 03/12] qtest: Document calling conventions Eric Blake
2017-07-28 12:26 ` Stefan Hajnoczi
2017-07-28 18:32 ` Markus Armbruster
2017-07-28 19:00 ` Eric Blake
2017-07-31 8:20 ` Markus Armbruster
2017-07-31 12:22 ` Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 04/12] tests: Pass literal format strings directly to qmp_FOO() Eric Blake
2017-07-26 23:28 ` John Snow
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 05/12] tests: Clean up string interpolation into QMP input (simple cases) Eric Blake
2017-07-28 12:32 ` Stefan Hajnoczi
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 06/12] tests/libqos/usb: Clean up string interpolation into QMP input Eric Blake
2017-07-28 12:33 ` Stefan Hajnoczi
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 07/12] qtest: Add a new helper qmp_cmd() and friends Eric Blake
2017-07-28 12:57 ` Stefan Hajnoczi
2017-07-28 13:06 ` Eric Blake
2017-07-28 16:33 ` Eric Blake
2017-07-31 8:16 ` Markus Armbruster [this message]
2017-07-31 12:34 ` Eric Blake
2017-07-31 18:56 ` Eric Blake
2017-08-01 5:48 ` Markus Armbruster
2017-08-01 14:13 ` Eric Blake
2017-07-28 18:45 ` Markus Armbruster
2017-07-28 18:53 ` Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 08/12] qtests: convert tests to use qmp_cmd Eric Blake
2017-07-28 12:59 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-07-28 18:53 ` [Qemu-devel] " Markus Armbruster
2017-07-28 19:08 ` Eric Blake
2017-07-31 7:28 ` Markus Armbruster
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 09/12] tests/libqos/pci: Clean up string interpolation into QMP input Eric Blake
2017-07-28 13:05 ` Stefan Hajnoczi
2017-07-28 16:35 ` Eric Blake
2017-07-28 16:37 ` Eric Blake
2017-07-31 7:29 ` Markus Armbruster
2017-07-31 18:33 ` Eric Blake
2017-08-01 5:40 ` Markus Armbruster
2017-07-28 17:42 ` Markus Armbruster
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 10/12] tests: Clean up wait for event Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 11/12] tests/libqtest: Clean up how we read the QMP greeting Eric Blake
2017-07-25 21:15 ` [Qemu-devel] [PATCH v3 12/12] tests/libqtest: Enable compile-time format string checking Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871soxaumw.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.