migrate_add_blocker() can fail (e.g. if migration is already in
progress), in which case it returns a negative value and populates
its errp argument with the reason.

The previous code ignored the return value, leaving state
inconsistent on failure. Fix this by:
- Passing a local Error ** so failure details can be reported.
- Checking the return value; on failure, report the error, free the
  migration_blocker Error object, and return NULL to the caller.

Resolves: CID 1645470

Signed-off-by: Trieu Huynh <[email protected]>
---
 plugins/api-system.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/plugins/api-system.c b/plugins/api-system.c
index 9a70b9caa6..f0d6cefe74 100644
--- a/plugins/api-system.c
+++ b/plugins/api-system.c
@@ -105,10 +105,16 @@ static Error *migration_blocker;
 const void *qemu_plugin_request_time_control(void)
 {
     if (!has_control) {
+        Error *local_err = NULL;
         has_control = true;
         error_setg(&migration_blocker,
                    "TCG plugin time control does not support migration");
-        migrate_add_blocker(&migration_blocker, NULL);
+        if (migrate_add_blocker(&migration_blocker, &local_err) < 0) {
+            error_report_err(local_err);
+            error_free(migration_blocker);
+            migration_blocker = NULL;
+            return NULL;
+        }
         return &has_control;
     }
     return NULL;
-- 
2.43.0


Reply via email to