]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: add validation of audio backend IDs
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 24 Feb 2021 17:20:53 +0000 (17:20 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 9 Mar 2021 22:58:20 +0000 (22:58 +0000)
Validate that if a non-zero audio ID is given for <sound> or <graphics>
elements, it must map to an <audio> backend that exists.

Validate that audio IDs given in <audio> are unique.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/conf/domain_validate.c

index 61cd0a07e5eddeb25f8b5cd7de12dd750b2ef8f1..00e02165472e2667118be5ed73fa4af879dd1c8c 100644 (file)
@@ -1793,6 +1793,62 @@ virDomainFSDefValidate(const virDomainFSDef *fs)
     return 0;
 }
 
+static int
+virDomainEnsureAudioID(const virDomainDef *def,
+                       unsigned int id)
+{
+    size_t i;
+
+    if (id == 0)
+        return 0;
+
+    for (i = 0; i < def->naudios; i++) {
+        if (def->audios[i]->id == id)
+            return 0;
+    }
+
+    virReportError(VIR_ERR_XML_ERROR,
+                   _("no audio device with ID %u"),
+                   id);
+    return -1;
+}
+
+static int
+virDomainSoundDefValidate(const virDomainDef *def,
+                          const virDomainSoundDef *sound)
+{
+    return virDomainEnsureAudioID(def, sound->audioId);
+}
+
+static int
+virDomainAudioDefValidate(const virDomainDef *def,
+                          const virDomainAudioDef *audio)
+{
+    size_t i;
+
+    for (i = 0; i < def->naudios; i++) {
+        if (def->audios[i] == audio)
+            continue;
+        if (def->audios[i]->id == audio->id) {
+            virReportError(VIR_ERR_XML_ERROR,
+                           _("audio ID %u is used multiple times"),
+                           audio->id);
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+static int
+virDomainGraphicsDefValidate(const virDomainDef *def,
+                             const virDomainGraphicsDef *graphics)
+{
+    if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC)
+        return virDomainEnsureAudioID(def, graphics->data.vnc.audioId);
+
+    return 0;
+}
 
 static int
 virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
@@ -1842,11 +1898,16 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
         return virDomainFSDefValidate(dev->data.fs);
 
     case VIR_DOMAIN_DEVICE_AUDIO:
-        /* TODO: validate? */
-    case VIR_DOMAIN_DEVICE_LEASE:
+        return virDomainAudioDefValidate(def, dev->data.audio);
+
     case VIR_DOMAIN_DEVICE_SOUND:
-    case VIR_DOMAIN_DEVICE_WATCHDOG:
+        return virDomainSoundDefValidate(def, dev->data.sound);
+
     case VIR_DOMAIN_DEVICE_GRAPHICS:
+        return virDomainGraphicsDefValidate(def, dev->data.graphics);
+
+    case VIR_DOMAIN_DEVICE_LEASE:
+    case VIR_DOMAIN_DEVICE_WATCHDOG:
     case VIR_DOMAIN_DEVICE_HUB:
     case VIR_DOMAIN_DEVICE_MEMBALLOON:
     case VIR_DOMAIN_DEVICE_NVRAM: