On 6/20/24 11:21, Rayhan Faizel wrote:
Under the test environment, driver->domainEventState is
uninitialized. If a
disk gets dropped, it will attempt to queue an event which will cause a
segmentation fault. This crash does not occur during normal use.
This patch adds a quick check to ensure driver->domainEventState is not NULL
along with a testcase exercising the dropping of disks with startupPolicy set
as 'optional'.
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
src/qemu/qemu_domain.c | 3 +-
...tuppolicy-optional-drop.x86_64-latest.args | 33 ++++++++++++++++
...rtuppolicy-optional-drop.x86_64-latest.xml | 38 +++++++++++++++++++
.../disk-startuppolicy-optional-drop.xml | 23 +++++++++++
tests/qemuxmlconftest.c | 2 +
5 files changed, 98 insertions(+), 1 deletion(-)
create mode 100644
tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
create mode 100644
tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 7ba2ea4a5e..109c5bbd52 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7592,7 +7592,8 @@ qemuDomainCheckRemoveOptionalDisk(virQEMUDriver *driver,
virDomainDiskDefFree(disk);
}
- virObjectEventStateQueue(driver->domainEventState, event);
+ if (driver->domainEventState)
+ virObjectEventStateQueue(driver->domainEventState, event);
}
I'd rather see our tests creating this queue. E.g. like this:
diff --git i/tests/testutilsqemu.c w/tests/testutilsqemu.c
index d70850cb5d..b870657063 100644
--- i/tests/testutilsqemu.c
+++ w/tests/testutilsqemu.c
@@ -231,6 +231,7 @@ void qemuTestDriverFree(virQEMUDriver *driver)
virFileDeleteTree(driver->config->stateDir);
virFileDeleteTree(driver->config->configDir);
}
+ virObjectUnref(driver->domainEventState);
virObjectUnref(driver->qemuCapsCache);
virObjectUnref(driver->xmlopt);
virObjectUnref(driver->caps);
@@ -343,6 +344,9 @@ int qemuTestDriverInit(virQEMUDriver *driver)
cfg->configDir = g_strdup(configdir);
+ if (!(driver->domainEventState = virObjectEventStateNew()))
+ goto error;
+
driver->caps = testQemuCapsInit();
if (!driver->caps)
goto error;
BTW: this is also what qemuhotplugtest does:
diff --git i/tests/qemuhotplugtest.c w/tests/qemuhotplugtest.c
index d935ad58ed..f707121c47 100644
--- i/tests/qemuhotplugtest.c
+++ w/tests/qemuhotplugtest.c
@@ -501,9 +501,6 @@ mymain(void)
virEventRegisterDefaultImpl();
- if (!(driver.domainEventState = virObjectEventStateNew()))
- return EXIT_FAILURE;
-
driver.lockManager = virLockManagerPluginNew("nop", "qemu",
driver.config->configBaseDir,
0);
Michal