From: Peter Krempa Date: Fri, 5 Nov 2021 15:51:22 +0000 (+0100) Subject: conf: Properly instantiate virDomainChrSourceDef in virDomainTPMDef X-Git-Tag: v7.10.0-rc1~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=42b000069946bc5c8b2cdf52df1e233b68b49982;p=thirdparty%2Flibvirt.git conf: Properly instantiate virDomainChrSourceDef in virDomainTPMDef 'virDomainChrSourceDef' contains private data so 'virDomainChrSourceDefNew' must be used to allocate it. 'virDomainTPMDef' was using it directly which won't work with the chardev helper functions. Convert it to a pointer to properly allocate private data. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index 69c5792b07..17a01c51ba 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -536,7 +536,7 @@ virDomainAuditTPM(virDomainObj *vm, virDomainTPMDef *tpm, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - path = tpm->data.passthrough.source.data.file.path; + path = tpm->data.passthrough.source->data.file.path; if (!(device = virAuditEncode("device", VIR_AUDIT_STR(path)))) { VIR_WARN("OOM while encoding audit message"); goto cleanup; @@ -547,7 +547,7 @@ virDomainAuditTPM(virDomainObj *vm, virDomainTPMDef *tpm, virt, reason, vmname, uuidstr, device); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: - path = tpm->data.emulator.source.data.nix.path; + path = tpm->data.emulator.source->data.nix.path; if (!(device = virAuditEncode("device", VIR_AUDIT_STR(path)))) { VIR_WARN("OOM while encoding audit message"); goto cleanup; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 52f513f488..7231d8fc3f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3211,10 +3211,10 @@ void virDomainTPMDefFree(virDomainTPMDef *def) switch (def->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - virDomainChrSourceDefClear(&def->data.passthrough.source); + virObjectUnref(def->data.passthrough.source); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: - virDomainChrSourceDefClear(&def->data.emulator.source); + virObjectUnref(def->data.emulator.source); g_free(def->data.emulator.storagepath); g_free(def->data.emulator.logfile); break; @@ -11831,13 +11831,17 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt, switch (def->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: + if (!(def->data.passthrough.source = virDomainChrSourceDefNew(xmlopt))) + goto error; path = virXPathString("string(./backend/device/@path)", ctxt); if (!path) path = g_strdup(VIR_DOMAIN_TPM_DEFAULT_DEVICE); - def->data.passthrough.source.data.file.path = g_steal_pointer(&path); - def->data.passthrough.source.type = VIR_DOMAIN_CHR_TYPE_DEV; + def->data.passthrough.source->type = VIR_DOMAIN_CHR_TYPE_DEV; + def->data.passthrough.source->data.file.path = g_steal_pointer(&path); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: + if (!(def->data.emulator.source = virDomainChrSourceDefNew(xmlopt))) + goto error; secretuuid = virXPathString("string(./backend/encryption/@secret)", ctxt); if (secretuuid) { if (virUUIDParse(secretuuid, def->data.emulator.secretuuid) < 0) { @@ -25456,7 +25460,7 @@ virDomainTPMDefFormat(virBuffer *buf, virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); virBufferEscapeString(buf, "\n", - def->data.passthrough.source.data.file.path); + def->data.passthrough.source->data.file.path); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f222d8ca88..8634960313 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1381,10 +1381,10 @@ struct _virDomainTPMDef { int version; /* virDomainTPMVersion */ union { struct { - virDomainChrSourceDef source; + virDomainChrSourceDef *source; } passthrough; struct { - virDomainChrSourceDef source; + virDomainChrSourceDef *source; char *storagepath; char *logfile; unsigned char secretuuid[VIR_UUID_BUFLEN]; diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 471cbc3b8f..1e7b562b33 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -340,7 +340,7 @@ qemuSetupTPMCgroup(virDomainObj *vm, switch (dev->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - ret = qemuSetupChrSourceCgroup(vm, &dev->data.passthrough.source); + ret = qemuSetupChrSourceCgroup(vm, dev->data.passthrough.source); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: case VIR_DOMAIN_TPM_TYPE_LAST: diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f3b02d3438..623e3a20a9 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9947,7 +9947,7 @@ qemuBuildTPMBackendStr(virCommand *cmd, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - tpmdev = tpm->data.passthrough.source.data.file.path; + tpmdev = tpm->data.passthrough.source->data.file.path; if (!(cancel_path = virTPMCreateCancelPath(tpmdev))) return NULL; @@ -9972,7 +9972,7 @@ qemuBuildTPMBackendStr(virCommand *cmd, virBufferAddLit(&buf, ",chardev=chrtpm"); *chardev = g_strdup_printf("socket,id=chrtpm,path=%s", - tpm->data.emulator.source.data.nix.path); + tpm->data.emulator.source->data.nix.path); break; case VIR_DOMAIN_TPM_TYPE_LAST: @@ -10041,7 +10041,7 @@ qemuBuildTPMProxyCommandLine(virCommand *cmd, if (virJSONValueObjectAdd(&props, "s:driver", virDomainTPMModelTypeToString(tpm->model), "s:id", tpm->info.alias, - "s:host-path", tpm->data.passthrough.source.data.file.path, + "s:host-path", tpm->data.passthrough.source->data.file.path, NULL) < 0) return -1; diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c index f1aaca86b1..23b1160c5e 100644 --- a/src/qemu/qemu_namespace.c +++ b/src/qemu/qemu_namespace.c @@ -422,7 +422,7 @@ qemuDomainSetupTPM(virDomainTPMDef *dev, { switch (dev->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - *paths = g_slist_prepend(*paths, g_strdup(dev->data.passthrough.source.data.file.path)); + *paths = g_slist_prepend(*paths, g_strdup(dev->data.passthrough.source->data.file.path)); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c index 7d05394356..62f54f56ab 100644 --- a/src/qemu/qemu_tpm.c +++ b/src/qemu/qemu_tpm.c @@ -332,11 +332,11 @@ qemuTPMEmulatorPrepareHost(virDomainTPMDef *tpm, return -1; /* create the socket filename */ - if (!tpm->data.emulator.source.data.nix.path && - !(tpm->data.emulator.source.data.nix.path = + if (!tpm->data.emulator.source->data.nix.path && + !(tpm->data.emulator.source->data.nix.path = qemuTPMCreateEmulatorSocket(swtpmStateDir, shortName))) return -1; - tpm->data.emulator.source.type = VIR_DOMAIN_CHR_TYPE_UNIX; + tpm->data.emulator.source->type = VIR_DOMAIN_CHR_TYPE_UNIX; return 0; } @@ -716,7 +716,7 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDef *tpm, secretuuid) < 0) goto error; - unlink(tpm->data.emulator.source.data.nix.path); + unlink(tpm->data.emulator.source->data.nix.path); cmd = virCommandNew(swtpm); if (!cmd) @@ -726,7 +726,7 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDef *tpm, virCommandAddArgList(cmd, "socket", "--daemon", "--ctrl", NULL); virCommandAddArgFormat(cmd, "type=unixio,path=%s,mode=0600", - tpm->data.emulator.source.data.nix.path); + tpm->data.emulator.source->data.nix.path); virCommandAddArg(cmd, "--tpmstate"); virCommandAddArgFormat(cmd, "dir=%s,mode=0600", diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 1733d63410..e9e316551e 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1686,12 +1686,12 @@ virSecurityDACSetTPMFileLabel(virSecurityManager *mgr, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: ret = virSecurityDACSetChardevLabelHelper(mgr, def, - &tpm->data.passthrough.source, + tpm->data.passthrough.source, false, false); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: ret = virSecurityDACSetChardevLabelHelper(mgr, def, - &tpm->data.emulator.source, + tpm->data.emulator.source, false, false); break; case VIR_DOMAIN_TPM_TYPE_LAST: @@ -1712,7 +1712,7 @@ virSecurityDACRestoreTPMFileLabel(virSecurityManager *mgr, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: ret = virSecurityDACRestoreChardevLabelHelper(mgr, def, - &tpm->data.passthrough.source, + tpm->data.passthrough.source, false, false); break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 622a8f4c02..840a05844e 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1637,7 +1637,7 @@ virSecuritySELinuxSetTPMFileLabel(virSecurityManager *mgr, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - tpmdev = tpm->data.passthrough.source.data.file.path; + tpmdev = tpm->data.passthrough.source->data.file.path; rc = virSecuritySELinuxSetFilecon(mgr, tpmdev, seclabel->imagelabel, false); if (rc < 0) return -1; @@ -1656,7 +1656,7 @@ virSecuritySELinuxSetTPMFileLabel(virSecurityManager *mgr, } break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: - tpmdev = tpm->data.emulator.source.data.nix.path; + tpmdev = tpm->data.emulator.source->data.nix.path; rc = virSecuritySELinuxSetFilecon(mgr, tpmdev, seclabel->imagelabel, false); if (rc < 0) return -1; @@ -1685,7 +1685,7 @@ virSecuritySELinuxRestoreTPMFileLabelInt(virSecurityManager *mgr, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - tpmdev = tpm->data.passthrough.source.data.file.path; + tpmdev = tpm->data.passthrough.source->data.file.path; rc = virSecuritySELinuxRestoreFileLabel(mgr, tpmdev, false); if ((cancel_path = virTPMCreateCancelPath(tpmdev)) != NULL) { diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 161e7efa62..1d0d6e14ba 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -450,9 +450,9 @@ testCompareXMLToArgvCreateArgs(virQEMUDriver *drv, if (vm->def->tpms[i]->type != VIR_DOMAIN_TPM_TYPE_EMULATOR) continue; - VIR_FREE(vm->def->tpms[i]->data.emulator.source.data.file.path); - vm->def->tpms[i]->data.emulator.source.data.file.path = g_strdup("/dev/test"); - vm->def->tpms[i]->data.emulator.source.type = VIR_DOMAIN_CHR_TYPE_FILE; + VIR_FREE(vm->def->tpms[i]->data.emulator.source->data.file.path); + vm->def->tpms[i]->data.emulator.source->data.file.path = g_strdup("/dev/test"); + vm->def->tpms[i]->data.emulator.source->type = VIR_DOMAIN_CHR_TYPE_FILE; } for (i = 0; i < vm->def->nvideos; i++) {