From 5fe7795d5fa5061f0ba615472f9351f9d29abf48 Mon Sep 17 00:00:00 2001 Message-Id: <5fe7795d5fa5061f0ba615472f9351f9d29abf48@dist-git> From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Fri, 2 Oct 2020 13:44:44 +0200 Subject: [PATCH] check for NULL before calling g_regex_unref MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit g_regex_unref reports an error if called with a NULL argument. We have two cases in the code where we (possibly) call it on a NULL argument. The interesting one is in virDomainQemuMonitorEventCleanup. Based on VIR_CONNECT_DOMAIN_QEMU_MONITOR_EVENT_REGISTER_REGEX, we unref data->regex, which has two problems: * On the client side, flags is -1 so the comparison is true even if no regex was used, reproducible by: $ virsh qemu-monitor-event --timeout 1 which results in an ugly error: (process:1289846): GLib-CRITICAL **: 14:58:42.631: g_regex_unref: assertion 'regex != NULL' failed * On the server side, we only create the regex if both the flag and the string are present, so it's possible to trigger this message by: $ virsh qemu-monitor-event --regex --timeout 1 Use a non-NULL comparison instead of the flag to decide whether we need to unref the regex. And add a non-NULL check to the unref in the VirtualBox test too. Signed-off-by: Ján Tomko Fixes: 71efb59a4de7c51b1bc889a316f1796ebf55738f https://bugzilla.redhat.com/show_bug.cgi?id=1876907 Reviewed-by: Peter Krempa Reviewed-by: Martin Kletzander (cherry picked from commit 92b252456ee6d6ffc6e39e62ce1ce6c50113e00e) https://bugzilla.redhat.com/show_bug.cgi?id=1861176 Signed-off-by: Ján Tomko Message-Id: <7d3c84f6556d0d46ada037d5e56c831babba609f.1601639064.git.jtomko@redhat.com> Reviewed-by: Jiri Denemark --- src/conf/domain_event.c | 2 +- tests/vboxsnapshotxmltest.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 33fbf10406..d3acde0236 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -2194,7 +2194,7 @@ virDomainQemuMonitorEventCleanup(void *opaque) virDomainQemuMonitorEventData *data = opaque; VIR_FREE(data->event); - if (data->flags & VIR_CONNECT_DOMAIN_QEMU_MONITOR_EVENT_REGISTER_REGEX) + if (data->regex) g_regex_unref(data->regex); if (data->freecb) (data->freecb)(data->opaque); diff --git a/tests/vboxsnapshotxmltest.c b/tests/vboxsnapshotxmltest.c index d1a7522931..8577157020 100644 --- a/tests/vboxsnapshotxmltest.c +++ b/tests/vboxsnapshotxmltest.c @@ -134,7 +134,8 @@ mymain(void) DO_TEST("2disks-3snap-brother"); cleanup: - g_regex_unref(testSnapshotXMLVariableLineRegex); + if (testSnapshotXMLVariableLineRegex) + g_regex_unref(testSnapshotXMLVariableLineRegex); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 2.28.0