From 89d724b157480ea947a8bd8218dc8fca95447226 Mon Sep 17 00:00:00 2001 From: Xu Yandong Date: Thu, 19 Sep 2019 04:02:15 -0400 Subject: [PATCH] object_event: reference state only if virEventAddTimeout succeeded When registering new callback for an event, the event loop timer must be created and registered. The timer has domain event state object as an opaque argument which must be ref()-ed but only if the timer was being created and registered successfully. We must not ref it every time the virObjectEventStateRegisterID() runs. Signed-off-by: Xu Yandong Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik Reviewed-by: Daniel Henrique Barboza --- src/conf/object_event.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 5d84598d59..a50a09e1a0 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -891,19 +891,20 @@ virObjectEventStateRegisterID(virConnectPtr conn, virObjectLock(state); if ((state->callbacks->count == 0) && - (state->timer == -1) && - (state->timer = virEventAddTimeout(-1, - virObjectEventTimer, - state, - virObjectFreeCallback)) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("could not initialize domain event timer")); - goto cleanup; - } + (state->timer == -1)) { + if ((state->timer = virEventAddTimeout(-1, + virObjectEventTimer, + state, + virObjectFreeCallback)) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("could not initialize domain event timer")); + goto cleanup; + } - /* event loop has one reference, but we need one more for the - * timer's opaque argument */ - virObjectRef(state); + /* event loop has one reference, but we need one more for the + * timer's opaque argument */ + virObjectRef(state); + } ret = virObjectEventCallbackListAddID(conn, state->callbacks, key, filter, filter_opaque,