mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
conf: Rework <tpm/> formatting
The <tpm/> element formatting is handled in virDomainTPMDefFormat() which uses the "old style" - appending strings directly into the output buffer. With this, it's easy to get conditions that tell when an element has ended wrong. In this particular case, if both <encryption/> and <active_pcr_banks/> are to be formatted the current code puts a stray '>' into the output buffer, resulting in invalid XML. Rewrite the function to use virXMLFormatElement() which is more clever. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2016599#c15 Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
parent
d00e6dfe6b
commit
5e2a368c61
@ -25495,63 +25495,54 @@ virDomainTPMDefFormat(virBuffer *buf,
|
|||||||
virDomainTPMDef *def,
|
virDomainTPMDef *def,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virBufferAsprintf(buf, "<tpm model='%s'>\n",
|
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||||
|
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
|
||||||
|
g_auto(virBuffer) backendAttrBuf = VIR_BUFFER_INITIALIZER;
|
||||||
|
g_auto(virBuffer) backendChildBuf = VIR_BUFFER_INIT_CHILD(&childBuf);
|
||||||
|
|
||||||
|
virBufferAsprintf(&attrBuf, " model='%s'",
|
||||||
virDomainTPMModelTypeToString(def->model));
|
virDomainTPMModelTypeToString(def->model));
|
||||||
virBufferAdjustIndent(buf, 2);
|
|
||||||
virBufferAsprintf(buf, "<backend type='%s'",
|
virBufferAsprintf(&backendAttrBuf, " type='%s'",
|
||||||
virDomainTPMBackendTypeToString(def->type));
|
virDomainTPMBackendTypeToString(def->type));
|
||||||
|
|
||||||
switch (def->type) {
|
switch (def->type) {
|
||||||
case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
|
case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
|
||||||
virBufferAddLit(buf, ">\n");
|
virBufferEscapeString(&backendChildBuf, "<device path='%s'/>\n",
|
||||||
virBufferAdjustIndent(buf, 2);
|
|
||||||
virBufferEscapeString(buf, "<device path='%s'/>\n",
|
|
||||||
def->data.passthrough.source->data.file.path);
|
def->data.passthrough.source->data.file.path);
|
||||||
virBufferAdjustIndent(buf, -2);
|
|
||||||
virBufferAddLit(buf, "</backend>\n");
|
|
||||||
break;
|
break;
|
||||||
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
|
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
|
||||||
virBufferAsprintf(buf, " version='%s'",
|
virBufferAsprintf(&backendAttrBuf, " version='%s'",
|
||||||
virDomainTPMVersionTypeToString(def->version));
|
virDomainTPMVersionTypeToString(def->version));
|
||||||
if (def->data.emulator.persistent_state)
|
if (def->data.emulator.persistent_state)
|
||||||
virBufferAddLit(buf, " persistent_state='yes'");
|
virBufferAddLit(&backendAttrBuf, " persistent_state='yes'");
|
||||||
if (def->data.emulator.hassecretuuid) {
|
if (def->data.emulator.hassecretuuid) {
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
virBufferAddLit(buf, ">\n");
|
|
||||||
virBufferAdjustIndent(buf, 2);
|
virBufferAsprintf(&backendChildBuf, "<encryption secret='%s'/>\n",
|
||||||
virBufferAsprintf(buf, "<encryption secret='%s'/>\n",
|
virUUIDFormat(def->data.emulator.secretuuid, uuidstr));
|
||||||
virUUIDFormat(def->data.emulator.secretuuid, uuidstr));
|
|
||||||
virBufferAdjustIndent(buf, -2);
|
|
||||||
}
|
}
|
||||||
if (def->data.emulator.activePcrBanks) {
|
if (def->data.emulator.activePcrBanks) {
|
||||||
|
g_auto(virBuffer) activePcrBanksBuf = VIR_BUFFER_INIT_CHILD(&backendChildBuf);
|
||||||
size_t i;
|
size_t i;
|
||||||
virBufferAddLit(buf, ">\n");
|
|
||||||
virBufferAdjustIndent(buf, 2);
|
|
||||||
virBufferAddLit(buf, "<active_pcr_banks>\n");
|
|
||||||
virBufferAdjustIndent(buf, 2);
|
|
||||||
for (i = VIR_DOMAIN_TPM_PCR_BANK_SHA1; i < VIR_DOMAIN_TPM_PCR_BANK_LAST; i++) {
|
for (i = VIR_DOMAIN_TPM_PCR_BANK_SHA1; i < VIR_DOMAIN_TPM_PCR_BANK_LAST; i++) {
|
||||||
if ((def->data.emulator.activePcrBanks & (1 << i)))
|
if ((def->data.emulator.activePcrBanks & (1 << i)))
|
||||||
virBufferAsprintf(buf, "<%s/>\n",
|
virBufferAsprintf(&activePcrBanksBuf, "<%s/>\n",
|
||||||
virDomainTPMPcrBankTypeToString(i));
|
virDomainTPMPcrBankTypeToString(i));
|
||||||
}
|
}
|
||||||
virBufferAdjustIndent(buf, -2);
|
|
||||||
virBufferAddLit(buf, "</active_pcr_banks>\n");
|
virXMLFormatElement(&backendChildBuf, "active_pcr_banks", NULL, &activePcrBanksBuf);
|
||||||
virBufferAdjustIndent(buf, -2);
|
|
||||||
}
|
}
|
||||||
if (def->data.emulator.hassecretuuid ||
|
|
||||||
def->data.emulator.activePcrBanks)
|
|
||||||
virBufferAddLit(buf, "</backend>\n");
|
|
||||||
else
|
|
||||||
virBufferAddLit(buf, "/>\n");
|
|
||||||
break;
|
break;
|
||||||
case VIR_DOMAIN_TPM_TYPE_LAST:
|
case VIR_DOMAIN_TPM_TYPE_LAST:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
virDomainDeviceInfoFormat(buf, &def->info, flags);
|
virXMLFormatElement(&childBuf, "backend", &backendAttrBuf, &backendChildBuf);
|
||||||
|
virDomainDeviceInfoFormat(&childBuf, &def->info, flags);
|
||||||
|
|
||||||
virBufferAdjustIndent(buf, -2);
|
virXMLFormatElement(buf, "tpm", &attrBuf, &childBuf);
|
||||||
virBufferAddLit(buf, "</tpm>\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user