Commit 74f24cb6 authored by Eric Blake's avatar Eric Blake Committed by Markus Armbruster

qapi: Fix string input visitor handling of invalid list

As shown in the previous commit, the string input visitor was
treating bogus input as an empty list rather than an error.
Fix parse_str() to set errp, then the callers to exit early if
an error was reported.

Meanwhile, fix the testsuite to use the generated
qapi_free_int16List() instead of rolling our own, and to
validate the fixed behavior, while at the same time documenting
one more change that we'd like to make in a later patch (a
failed visit_start_list should guarantee a NULL pointer,
regardless of what things were on input).
Signed-off-by: 's avatarEric Blake <>
Message-Id: <>
Signed-off-by: 's avatarMarkus Armbruster <>
parent 73374683
......@@ -44,7 +44,7 @@ static void free_range(void *range, void *dummy)
static void parse_str(StringInputVisitor *siv, Error **errp)
static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
char *str = (char *) siv->string;
long long start, end;
......@@ -52,7 +52,7 @@ static void parse_str(StringInputVisitor *siv, Error **errp)
char *endptr;
if (siv->ranges) {
return 0;
do {
......@@ -117,11 +117,14 @@ static void parse_str(StringInputVisitor *siv, Error **errp)
} while (str);
return 0;
g_list_foreach(siv->ranges, free_range, NULL);
siv->ranges = NULL;
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
"an int64 value or range");
return -1;
static void
......@@ -129,7 +132,9 @@ start_list(Visitor *v, const char *name, Error **errp)
StringInputVisitor *siv = to_siv(v);
parse_str(siv, errp);
if (parse_str(siv, name, errp) < 0) {
siv->cur_range = g_list_first(siv->ranges);
if (siv->cur_range) {
......@@ -195,7 +200,9 @@ static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
parse_str(siv, errp);
if (parse_str(siv, name, errp) < 0) {
if (!siv->ranges) {
goto error;
......@@ -92,19 +92,17 @@ static void test_visitor_in_intList(TestInputVisitorData *data,
tmp = res;
while (tmp) {
res = res->next;
tmp = res;
visitor_input_teardown(data, unused);
v = visitor_input_test_init(data, "not an int list");
/* FIXME: res should be NULL on failure, regardless of starting value */
res = NULL;
visit_type_int16List(v, NULL, &res, &err);
/* FIXME fix the visitor, then error_free_or_abort(&err) here */
static void test_visitor_in_bool(TestInputVisitorData *data,
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment