From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH 2/5] tests: Enhance qobject output to cover partial visit
Date: Fri, 14 Jul 2017 14:08:24 -0500 [thread overview]
Message-ID: <20170714190827.4083-3-eblake@redhat.com> (raw)
In-Reply-To: <20170714190827.4083-1-eblake@redhat.com>
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().
+ */
+ 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",
--
2.9.4
next prev parent reply other threads:[~2017-07-14 19:08 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 ` Eric Blake [this message]
2017-07-20 9:52 ` [Qemu-devel] [PATCH 2/5] tests: Enhance qobject output to cover partial visit Markus Armbruster
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=20170714190827.4083-3-eblake@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@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.