[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.