]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
ch_driver: Add additional validation for save/restore
authorPurna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
Mon, 11 Mar 2024 09:44:05 +0000 (09:44 +0000)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 20 Mar 2024 13:05:34 +0000 (14:05 +0100)
Save & Restore are supported without any network and hostdev config
defined. So, add a validation for it before performing save.

Signed-off-by: Purna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/ch/ch_driver.c

index 0237dfc477e744ed4f7bc8023e65b94d88976191..7308f40249e246ddf65e1987d23cfe5fff74e4b5 100644 (file)
@@ -679,6 +679,26 @@ chDomainDestroy(virDomainPtr dom)
     return chDomainDestroyFlags(dom, 0);
 }
 
+static int
+chDomainSaveAdditionalValidation(virDomainDef *vmdef)
+{
+    /*
+    SAVE and RESTORE are functional only without any networking and
+    device passthrough configuration
+    */
+    if (vmdef->nnets > 0) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot save domain with network interfaces"));
+        return -1;
+    }
+    if  (vmdef->nhostdevs > 0) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot save domain with host devices"));
+        return -1;
+    }
+    return 0;
+}
+
 /**
  * chDoDomainSave:
  * @driver: pointer to driver structure
@@ -701,13 +721,17 @@ chDoDomainSave(virCHDriver *driver,
     g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
     virCHDomainObjPrivate *priv = vm->privateData;
     CHSaveXMLHeader hdr;
+    virDomainState domainState;
     g_autofree char *to = NULL;
     g_autofree char *xml = NULL;
     uint32_t xml_len;
     VIR_AUTOCLOSE fd = -1;
     int ret = -1;
 
-    virDomainState domainState = virDomainObjGetState(vm, NULL);
+    if (chDomainSaveAdditionalValidation(vm->def) < 0)
+        goto end;
+
+    domainState = virDomainObjGetState(vm, NULL);
     if (domainState == VIR_DOMAIN_RUNNING) {
         if (virCHMonitorSuspendVM(priv->monitor) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",