|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/6] libxl: Fix leak of ctx->lock
On Fri, 2012-02-17 at 19:15 +0000, Ian Jackson wrote:
> A mutex created with pthread_mutex_init, like ctx->lock, may need to
> be destroyed with pthread_mutex_destroy.
>
> Also, previously, if libxl__init_recursive_mutex failed, the nascent
> ctx would be leaked. Add some comments which will hopefully make
> these kind of mistakes less likely in future.
>
> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
> tools/libxl/libxl.c | 17 +++++++++++++----
> 1 files changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 7735223..fd890cf 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -39,10 +39,7 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version,
> memset(ctx, 0, sizeof(libxl_ctx));
> ctx->lg = lg;
>
> - if (libxl__init_recursive_mutex(ctx, &ctx->lock) < 0) {
> - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Failed to initialize mutex");
> - return ERROR_FAIL;
> - }
> + /* First initialise pointers (cannot fail) */
>
> LIBXL_TAILQ_INIT(&ctx->occurred);
>
> @@ -61,6 +58,16 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version,
> LIBXL_TAILQ_INIT(&ctx->death_list);
> libxl__ev_xswatch_init(&ctx->death_watch);
>
> + /* The mutex is special because we can't idempotently destroy it */
> +
> + if (libxl__init_recursive_mutex(ctx, &ctx->lock) < 0) {
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Failed to initialize mutex");
> + free(ctx);
> + ctx = 0;
> + }
> +
> + /* Now ctx is safe for ctx_free; failures simply set rc and "goto out" */
> +
> rc = libxl__poller_init(ctx, &ctx->poller_app);
> if (rc) goto out;
>
> @@ -150,6 +157,8 @@ int libxl_ctx_free(libxl_ctx *ctx)
>
> discard_events(&ctx->occurred);
>
> + pthread_mutex_destroy(&ctx->lock);
> +
> GC_FREE;
> free(ctx);
> return 0;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |