404507
From 37bf217cd53b115427999d5421dca30eb472616c Mon Sep 17 00:00:00 2001
404507
Message-Id: <37bf217cd53b115427999d5421dca30eb472616c@dist-git>
404507
From: Andrea Bolognani <abologna@redhat.com>
404507
Date: Wed, 29 Nov 2017 16:23:09 +0100
404507
Subject: [PATCH] qemu: Validate target model for serial devices
404507
404507
Target model and target type must agree for the configuration
404507
to make sense, so check that's actually the case and error out
404507
otherwise.
404507
404507
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
404507
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
404507
(cherry picked from commit a9254a2d6e9db1030350ff562b9ea91494143aa9)
404507
404507
https://bugzilla.redhat.com/show_bug.cgi?id=1449265
404507
https://bugzilla.redhat.com/show_bug.cgi?id=1511421
404507
https://bugzilla.redhat.com/show_bug.cgi?id=1512929
404507
https://bugzilla.redhat.com/show_bug.cgi?id=1512934
404507
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
404507
---
404507
 src/libvirt_private.syms |  2 ++
404507
 src/qemu/qemu_domain.c   | 41 +++++++++++++++++++++++++++++++++++++++++
404507
 2 files changed, 43 insertions(+)
404507
404507
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
404507
index 65b1143c9b..ecf7036dff 100644
404507
--- a/src/libvirt_private.syms
404507
+++ b/src/libvirt_private.syms
404507
@@ -209,6 +209,8 @@ virDomainChrGetDomainPtrs;
404507
 virDomainChrInsertPreAlloced;
404507
 virDomainChrPreAlloc;
404507
 virDomainChrRemove;
404507
+virDomainChrSerialTargetModelTypeFromString;
404507
+virDomainChrSerialTargetModelTypeToString;
404507
 virDomainChrSerialTargetTypeFromString;
404507
 virDomainChrSerialTargetTypeToString;
404507
 virDomainChrSourceDefClear;
404507
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
404507
index a8a91de2fe..7b5bc97de6 100644
404507
--- a/src/qemu/qemu_domain.c
404507
+++ b/src/qemu/qemu_domain.c
404507
@@ -3475,6 +3475,25 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType)
404507
 }
404507
 
404507
 
404507
+static int
404507
+qemuDomainChrSerialTargetModelToTargetType(int targetModel)
404507
+{
404507
+    switch ((virDomainChrSerialTargetModel) targetModel) {
404507
+    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
404507
+        return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
404507
+    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
404507
+        return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB;
404507
+    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
404507
+        return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI;
404507
+    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
404507
+    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
404507
+        break;
404507
+    }
404507
+
404507
+    return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
404507
+}
404507
+
404507
+
404507
 static int
404507
 qemuDomainChrTargetDefValidate(const virDomainDef *def,
404507
                                const virDomainChrDef *chr)
404507
@@ -3511,6 +3530,28 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
404507
         case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
404507
             break;
404507
         }
404507
+
404507
+        /* Validate target model */
404507
+        switch ((virDomainChrSerialTargetModel) chr->targetModel) {
404507
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
404507
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
404507
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
404507
+
404507
+            expected = qemuDomainChrSerialTargetModelToTargetType(chr->targetModel);
404507
+
404507
+            if (chr->targetType != expected) {
404507
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
404507
+                               _("Target model '%s' requires target type '%s'"),
404507
+                               virDomainChrSerialTargetModelTypeToString(chr->targetModel),
404507
+                               virDomainChrSerialTargetTypeToString(expected));
404507
+                return -1;
404507
+            }
404507
+            break;
404507
+
404507
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
404507
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
404507
+            break;
404507
+        }
404507
         break;
404507
 
404507
     case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
404507
-- 
404507
2.15.1
404507