[libvirt] [PATCH] conf: Remove console stream callback only when freeing console helper
Alex Jia
ajia at redhat.com
Fri Aug 3 09:56:15 UTC 2012
On 08/03/2012 05:27 PM, Peter Krempa wrote:
> Commit ba226d334acbc49f6751b430e0c4e00f69eef6bf tried to fix crash of
> the daemon when a domain with a 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.
I just tried your patch, it still exists use after free issue:
==21843== 1 errors in context 1 of 11:
==21843== Invalid read of size 4
==21843== at 0x4D2B79D: virStreamFree (libvirt.c:15345)
==21843== by 0x40B2E1: vshRunConsole (console.c:404)
==21843== by 0x4226CE: cmdRunConsole (virsh-domain.c:1658)
==21843== by 0x422AE3: cmdConsole (virsh-domain.c:1693)
==21843== by 0x42CBC4: vshCommandRun (virsh.c:1867)
==21843== by 0x42F872: main (virsh.c:3269)
==21843== Address 0x53c0250 is 0 bytes inside a block of size 40 free'd
==21843== at 0x4A0595D: free (vg_replace_malloc.c:366)
==21843== by 0x4C916C8: virFree (memory.c:309)
==21843== by 0x4D111BB: virUnrefStream (datatypes.c:1072)
==21843== by 0x4D2B7BD: virStreamFree (libvirt.c:15353)
==21843== by 0x40A984: virConsoleShutdown (console.c:103)
==21843== by 0x4C8912E: virEventPollRunOnce (event_poll.c:485)
==21843== by 0x4C87CA4: virEventRunDefaultImpl (event.c:247)
==21843== by 0x42C8A1: vshEventLoop (virsh.c:2406)
==21843== by 0x4C9C065: virThreadHelper (threads-pthread.c:161)
==21843== by 0x39CF8077F0: start_thread (pthread_create.c:301)
==21843== by 0x39CF0E570C: clone (clone.S:115)
Regards,
Alex
> ---
> src/conf/virconsole.c | 16 +++++++++++++---
> 1 files changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/src/conf/virconsole.c b/src/conf/virconsole.c
> index 912aff6..b3f6eb6 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);
>
> @@ -290,6 +287,18 @@ error:
> }
>
> /**
> + * 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.
> *
> * @cons Pointer to the private structure.
> @@ -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);
More information about the libvir-list
mailing list