'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 <pkrempa(a)redhat.com>
---
src/conf/domain_audit.c | 4 ++--
src/conf/domain_conf.c | 14 +++++++++-----
src/conf/domain_conf.h | 4 ++--
src/qemu/qemu_cgroup.c | 2 +-
src/qemu/qemu_command.c | 6 +++---
src/qemu/qemu_namespace.c | 2 +-
src/qemu/qemu_tpm.c | 10 +++++-----
src/security/security_dac.c | 6 +++---
src/security/security_selinux.c | 6 +++---
tests/qemuxml2argvtest.c | 6 +++---
10 files changed, 32 insertions(+), 28 deletions(-)
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, "<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;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3cb68c5d0a..c1b2a814aa 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++) {
--
2.31.1