qga: Fix qmp_guest_suspend_{disk, ram}() error handling
The Error ** argument must be NULL, &error_abort, &error_fatal, or a pointer to a variable containing NULL. Passing an argument of the latter kind twice without clearing it in between is wrong: if the first call sets an error, it no longer points to NULL for the second qmp_guest_suspend_disk() and qmp_guest_suspend_ram() pass @local_err first to check_suspend_mode(), then to acquire_privilege(), then to execute_async(). Continuing after errors here can only end in tears. For instance, we risk tripping error_setv()'s assertion. Fixes:aa59637ea1
Fixes:f54603b6aa
Cc: Michael Roth <mdroth@linux.vnet.ibm.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200422130719.28225-15-armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
parent
4155c998b6
commit
51bd458166
@ -1322,9 +1322,16 @@ void qmp_guest_suspend_disk(Error **errp)
|
||||
|
||||
*mode = GUEST_SUSPEND_MODE_DISK;
|
||||
check_suspend_mode(*mode, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
acquire_privilege(SE_SHUTDOWN_NAME, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
execute_async(do_suspend, mode, &local_err);
|
||||
|
||||
out:
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
g_free(mode);
|
||||
@ -1338,9 +1345,16 @@ void qmp_guest_suspend_ram(Error **errp)
|
||||
|
||||
*mode = GUEST_SUSPEND_MODE_RAM;
|
||||
check_suspend_mode(*mode, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
acquire_privilege(SE_SHUTDOWN_NAME, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
execute_async(do_suspend, mode, &local_err);
|
||||
|
||||
out:
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
g_free(mode);
|
||||
|
Loading…
Reference in New Issue
Block a user