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.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/conf/domain_validate.c | 67 ++++++++++++++++++++++++++++++++++++--
1 file changed, 64 insertions(+), 3 deletions(-)
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index b4e09e21fe..79732840eb 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -1783,6 +1783,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,
@@ -1832,11 +1888,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:
--
2.29.2