From 45edefc7a7bcbec988f54331ff37fc32e4bc2718 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 3 Aug 2012 11:20:29 +0200 Subject: [PATCH] conf: Remove console stream callback only when freeing console helper Commit ba226d334acbc49f6751b430e0c4e00f69eef6bf tried to fix crash of the daemon when a domain with an open console was destroyed. The fix was wrong as it tried to remove the callback also when the stream was aborted, where at that point the fd stream driver was already freed and removed. This patch clears the callbacks with a helper right before the hash is freed, so that it doesn't interfere with other codepaths where the stream object is freed. --- src/conf/virconsole.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/conf/virconsole.c b/src/conf/virconsole.c index 912aff6224..b3f6eb69c7 100644 --- a/src/conf/virconsole.c +++ b/src/conf/virconsole.c @@ -219,9 +219,6 @@ static void virConsoleHashEntryFree(void *data, const char *pty = name; virStreamPtr st = data; - /* remove callback from stream */ - virFDStreamSetInternalCloseCb(st, NULL, NULL, NULL); - /* free stream reference */ virStreamFree(st); @@ -289,6 +286,18 @@ error: return NULL; } +/** + * Helper to clear stream callbacks when freeing the hash + */ +static void virConsoleFreeClearCallbacks(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED) +{ + virStreamPtr st = payload; + + virFDStreamSetInternalCloseCb(st, NULL, NULL, NULL); +} + /** * Free structures for handling open console streams. * @@ -300,6 +309,7 @@ void virConsoleFree(virConsolesPtr cons) return; virMutexLock(&cons->lock); + virHashForEach(cons->hash, virConsoleFreeClearCallbacks, NULL); virHashFree(cons->hash); virMutexUnlock(&cons->lock); virMutexDestroy(&cons->lock); -- GitLab