mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-24 23:18:17 +00:00
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). Backports commit 74f24cb6306d065045d0e2215a7d10533fa59c57 from qemu
This commit is contained in:
parent
6084be1882
commit
ed72ba0f8b
1 changed files with 12 additions and 5 deletions
|
@ -44,7 +44,7 @@ static void free_range(void *range, void *dummy)
|
||||||
g_free(range);
|
g_free(range);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_str(StringInputVisitor *siv, Error **errp)
|
static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
||||||
{
|
{
|
||||||
char *str = (char *) siv->string;
|
char *str = (char *) siv->string;
|
||||||
long long start, end;
|
long long start, end;
|
||||||
|
@ -52,7 +52,7 @@ static void parse_str(StringInputVisitor *siv, Error **errp)
|
||||||
char *endptr;
|
char *endptr;
|
||||||
|
|
||||||
if (siv->ranges) {
|
if (siv->ranges) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -117,11 +117,14 @@ static void parse_str(StringInputVisitor *siv, Error **errp)
|
||||||
}
|
}
|
||||||
} while (str);
|
} while (str);
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
error:
|
error:
|
||||||
g_list_foreach(siv->ranges, free_range, NULL);
|
g_list_foreach(siv->ranges, free_range, NULL);
|
||||||
g_list_free(siv->ranges);
|
g_list_free(siv->ranges);
|
||||||
siv->ranges = NULL;
|
siv->ranges = NULL;
|
||||||
|
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
|
||||||
|
"an int64 value or range");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -129,7 +132,9 @@ start_list(Visitor *v, const char *name, Error **errp)
|
||||||
{
|
{
|
||||||
StringInputVisitor *siv = to_siv(v);
|
StringInputVisitor *siv = to_siv(v);
|
||||||
|
|
||||||
parse_str(siv, errp);
|
if (parse_str(siv, name, errp) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
siv->cur_range = g_list_first(siv->ranges);
|
siv->cur_range = g_list_first(siv->ranges);
|
||||||
if (siv->cur_range) {
|
if (siv->cur_range) {
|
||||||
|
@ -196,7 +201,9 @@ static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
parse_str(siv, errp);
|
if (parse_str(siv, name, errp) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!siv->ranges) {
|
if (!siv->ranges) {
|
||||||
goto error;
|
goto error;
|
||||||
|
|
Loading…
Reference in a new issue