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 <[email protected]>
> ---
> 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