mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
qapi: fix error propagation
Don't overwrite / leak previously set errors. Make traversal cope with missing mandatory sub-structs. Don't try to end a container that could not be started. v1->v2: - unchanged v2->v3: - instead of examining, assert that we never overwrite errors with error_set() - allow visitors to set a NULL struct pointer successfully, so traversal of incomplete objects can continue - check for a NULL "obj" before accessing "(*obj)->has_XXX" (this is not a typo, "obj != NULL" implies "*obj != NULL" here) - fix start_struct / end_struct balance for unions as well Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This commit is contained in:
parent
837c36e787
commit
d195325b05
6 changed files with 120 additions and 69 deletions
3
error.c
3
error.c
|
@ -32,6 +32,7 @@ void error_set(Error **errp, const char *fmt, ...)
|
|||
if (errp == NULL) {
|
||||
return;
|
||||
}
|
||||
assert(*errp == NULL);
|
||||
|
||||
err = g_malloc0(sizeof(*err));
|
||||
|
||||
|
@ -132,7 +133,7 @@ bool error_is_type(Error *err, const char *fmt)
|
|||
|
||||
void error_propagate(Error **dst_err, Error *local_err)
|
||||
{
|
||||
if (dst_err) {
|
||||
if (dst_err && !*dst_err) {
|
||||
*dst_err = local_err;
|
||||
} else if (local_err) {
|
||||
error_free(local_err);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue