From d1abf819cf1b2fda893c029344de77d5b6cc5ba9 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Wed, 9 Jul 2014 15:15:27 +0200 Subject: [PATCH] conf: Don't allow multiple seclabels for same model https://bugzilla.redhat.com/show_bug.cgi?id=1066894 With current code it's possible to have for instance: virsh dumpxml mydomain | grep seclabel what doesn't make any sense. We should reject the XML in the config parsing phase. Signed-off-by: Michal Privoznik --- src/conf/domain_conf.c | 19 +++++++-- .../qemuxml2argv-seclabel-multiple.xml | 40 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-multiple.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index eccecd4425..b91ccf7417 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4668,7 +4668,7 @@ virSecurityLabelDefsParseXML(virDomainDefPtr def, virCapsPtr caps, unsigned int flags) { - size_t i = 0; + size_t i = 0, j; int n; xmlNodePtr *list = NULL, saved_node; virCapsHostPtr host = &caps->host; @@ -4689,10 +4689,23 @@ virSecurityLabelDefsParseXML(virDomainDefPtr def, /* Parse each "seclabel" tag */ for (i = 0; i < n; i++) { + virSecurityLabelDefPtr seclabel; + ctxt->node = list[i]; - def->seclabels[i] = virSecurityLabelDefParseXML(ctxt, flags); - if (def->seclabels[i] == NULL) + if (!(seclabel = virSecurityLabelDefParseXML(ctxt, flags))) goto error; + + for (j = 0; j < i; j++) { + if (STREQ_NULLABLE(seclabel->model, def->seclabels[j]->model)) { + virReportError(VIR_ERR_XML_DETAIL, + _("seclablel for model %s is already provided"), + seclabel->model); + virSecurityLabelDefFree(seclabel); + goto error; + } + } + + def->seclabels[i] = seclabel; } def->nseclabels = n; ctxt->node = saved_node; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-multiple.xml b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-multiple.xml new file mode 100644 index 0000000000..bd6fd15e92 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-multiple.xml @@ -0,0 +1,40 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + + + +
+ + + + + + + + + + + system_u:system_r:svirt_custom_t:s0:c192,c392 + + + + system_u:system_r:svirt_custom_t:s0:c192,c393 + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index bbc0fb7a9b..a841adb3af 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1223,6 +1223,7 @@ mymain(void) DO_TEST("seclabel-static-labelskip", QEMU_CAPS_NAME); DO_TEST("seclabel-none", QEMU_CAPS_NAME); DO_TEST("seclabel-dac-none", QEMU_CAPS_NAME); + DO_TEST_PARSE_ERROR("seclabel-multiple", QEMU_CAPS_NAME); DO_TEST("pseries-basic", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);