From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 2/5] tests: Enhance qobject output to cover partial visit
Date: Thu, 20 Jul 2017 11:52:11 +0200 [thread overview]
Message-ID: <87mv7zmo50.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20170714190827.4083-3-eblake@redhat.com> (Eric Blake's message of "Fri, 14 Jul 2017 14:08:24 -0500")
Eric Blake <eblake@redhat.com> writes:
> Add a test that proves (at least when run under valgrind) that
> we are correctly handling allocated memory even when a visit
> is aborted in the middle for whatever other reason.
>
> See commit f24582d "qapi: fix double free in
> qmp_output_visitor_cleanup()" for a fix that was lacking
> testsuite exposure prior to this patch.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
> tests/test-qobject-output-visitor.c | 46 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/tests/test-qobject-output-visitor.c b/tests/test-qobject-output-visitor.c
> index 749c540..1e9a5d1 100644
> --- a/tests/test-qobject-output-visitor.c
> +++ b/tests/test-qobject-output-visitor.c
> @@ -1,7 +1,7 @@
> /*
> * QObject Output Visitor unit-tests.
> *
> - * Copyright (C) 2011-2016 Red Hat Inc.
> + * Copyright (C) 2011-2017 Red Hat Inc.
> *
> * Authors:
> * Luiz Capitulino <lcapitulino@redhat.com>
> @@ -251,6 +251,48 @@ static void test_visitor_out_struct_errors(TestOutputVisitorData *data,
> }
>
>
> +static void test_visitor_out_partial_visit(TestOutputVisitorData *data,
> + const void *unused)
> +{
> + /* Various checks that a mid-visit abort doesn't leak or double-free. */
> + const char *str = "hi";
> + Error *err = NULL;
> + UserDefAlternate uda = {
> + .type = QTYPE_QDICT,
> + .u.udfu = { .integer = 1,
> + .string = (char *) "bye",
> + .enum1 = -1 } /* intentionally bad */
> + };
> + UserDefAlternate *obj = &uda;
> +
> + /* Abort within a nested object with no data members */
> + visit_start_struct(data->ov, NULL, NULL, 0, &error_abort);
> + visit_start_struct(data->ov, "nested", NULL, 0, &error_abort);
> + visitor_reset(data);
> +
> + /* Abort in the middle of a list of strings */
> + visit_start_list(data->ov, "list", NULL, 0, &error_abort);
> + visit_type_str(data->ov, NULL, (char **)&str, &error_abort);
> + visit_type_str(data->ov, NULL, (char **)&str, &error_abort);
> + visitor_reset(data);
> +
> + /*
> + * Abort in the middle of an alternate. Alternates can't be
> + * virtually visited, so we get to inline the first half of
> + * visit_type_UserDefAlternate().
> + */
Not exactly inline. Perhaps:
/*
* Abort in the middle of an alternate. Since alternates don't
* support virtual visits, we perform a real one, similar to what
* visit_type_UserDefAlternate() would do.
*/
Hmm, what would visit_type_UserDefAlternate() do for @uda? Could we
simply call it here and be done?
I've explored supporting virtual alternate visits, but my solution isn't
quite ready, yet.
> + visit_start_alternate(data->ov, NULL, (GenericAlternate **)&obj,
> + sizeof(uda), &error_abort);
> + visit_start_struct(data->ov, NULL, NULL, 0, &error_abort);
> + visit_type_UserDefUnionBase_members(data->ov,
> + (UserDefUnionBase *)&uda.u.udfu,
> + &err);
> + /* error expected because of bad "enum1" discriminator value */
> + error_free_or_abort(&err);
> + visitor_reset(data);
> +}
> +
> +
> static void test_visitor_out_list(TestOutputVisitorData *data,
> const void *unused)
> {
> @@ -815,6 +857,8 @@ int main(int argc, char **argv)
> &out_visitor_data, test_visitor_out_struct_nested);
> output_visitor_test_add("/visitor/output/struct-errors",
> &out_visitor_data, test_visitor_out_struct_errors);
> + output_visitor_test_add("/visitor/output/partial-visit",
> + &out_visitor_data, test_visitor_out_partial_visit);
> output_visitor_test_add("/visitor/output/list",
> &out_visitor_data, test_visitor_out_list);
> output_visitor_test_add("/visitor/output/any",
next prev parent reply other threads:[~2017-07-20 9:52 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-14 19:08 [Qemu-devel] [PATCH 0/5] random qapi cleanups Eric Blake
2017-07-14 19:08 ` [Qemu-devel] [PATCH 1/5] qapi: Further enhance visitor virtual walk doc example Eric Blake
2017-07-20 9:05 ` Markus Armbruster
2017-07-20 20:21 ` Eric Blake
2017-07-14 19:08 ` [Qemu-devel] [PATCH 2/5] tests: Enhance qobject output to cover partial visit Eric Blake
2017-07-20 9:52 ` Markus Armbruster [this message]
2017-07-20 20:27 ` Eric Blake
2017-07-14 19:08 ` [Qemu-devel] [PATCH 3/5] qapi: Visitor documentation tweak Eric Blake
2017-07-20 10:00 ` Markus Armbruster
2017-07-20 20:28 ` Eric Blake
2017-07-14 19:08 ` [Qemu-devel] [PATCH 4/5] qtest: Avoid passing raw strings through hmp() Eric Blake
2017-07-20 10:03 ` Markus Armbruster
2017-07-14 19:08 ` [Qemu-devel] [PATCH 5/5] qtest: Document calling conventions Eric Blake
2017-07-20 10:10 ` Markus Armbruster
2017-07-20 20:37 ` Eric Blake
2017-07-20 20:53 ` Eric Blake
2017-07-21 6:42 ` Markus Armbruster
2017-07-21 12:08 ` Eric Blake
2017-07-21 14:13 ` Markus Armbruster
2017-07-18 16:09 ` [Qemu-devel] [PATCH 0/5] random qapi cleanups Markus Armbruster
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=87mv7zmo50.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/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.