TL;DR: - a dac sec label is parsed - it has no label, but due to a bug it searches one - label can't be found for an inactive domain - exit with Error - expected fix is reverting part of dfbc9a83 Debug-Analysis: Interesting part of the call chain: get_definition -> virDomainDefParseString -> virDomainDefParse -> virDomainDefParseNode -> virDomainDefParseXML -> virSecurityLabelDefsParseXML -> virSecurityLabelDefParseXML Compiled -O0 -g to see more to see where it is failing. The code itself (of that failing function) didn't change since 1.3.1 (Xenial). gdb ~/libvirt-2.1.0/debian/tmp/usr/lib/libvirt/virt-aa-helper set env LD_LIBRARY_PATH /home/ubuntu/libvirt-2.1.0/debian/tmp/usr/lib/x86_64-linux-gnu/ set solib-search-path /home/ubuntu/libvirt-2.1.0/debian/tmp/usr/lib/x86_64-linux-gnu/ b virSecurityLabelDefsParseXML run -d -r -p 0 -u libvirt-6e082f89-902c-413c-9d9e-f609089d3374 < yakkety-sec-dac.xml virSecurityLabelDefParseXML (ctxt=0x5555557ddaf0, flags=1024) at ../../../src/conf/domain_conf.c:6384 n (number of labels) is 1 single def parse in virSecurityLabelDefParseXML 1. type dynamic = VIR_DOMAIN_SECLABEL_DYNAMIC 2. relabel yes 3-5 useless if/jumps 6. fails at parsing the actual label it doesn't find a label, but thinks it needs one check: 6.1 seclabel->type == VIR_DOMAIN_SECLABEL_STATIC => it is not 6.2 !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) && => true 6.3 seclabel->type != VIR_DOMAIN_SECLABEL_NONE => true => There is no label for the currently off machine, so it fails to find one and goes to error path The function does right, but the flags suggest it would be alive. Definiton: /* Parse only parts of the XML that would be present in an inactive libvirt * XML. Note that the flag does not imply that ABI incompatible * transformations can be used, since it's used to strip runtime info when * restoring save images/migration. */ VIR_DOMAIN_DEF_PARSE_INACTIVE = 1 << 1, The flag comes from the first in the call chain "get_definition" ctl->def = virDomainDefParseString(xmlStr, ctl->caps, ctl->xmlopt, VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); That exactly is a diff of the Ubuntu versions on that call: ctl->def = virDomainDefParseString(xmlStr, ctl->caps, ctl->xmlopt, - VIR_DOMAIN_DEF_PARSE_INACTIVE); + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); Almost all other changes do OR it in: - int domainflags = VIR_DOMAIN_DEF_PARSE_INACTIVE; + int domainflags = VIR_DOMAIN_DEF_PARSE_INACTIVE | + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; Check upstream for the reasons: commit b394af162a3871575d9f9c28f72331f198aafa25 Author: Peter Krempa