[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl: Fix leaks on context init failure
# HG changeset patch # User Ian Jackson <ian.jackson@xxxxxxxxxxxxx> # Date 1326473667 0 # Node ID 6d8888519e3aae056956d41d77b53d22e132fbca # Parent cc969d75176039ea14c373f36e6f214e4b23e73b libxl: Fix leaks on context init failure Several of the error exits from libxl_ctx_alloc leaked the context struct itself and sometimes other resources too. Fix this by using the standard "rc = ERROR_FOO; goto out" error handling style throughout. Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Committed-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- diff -r cc969d751760 -r 6d8888519e3a tools/libxl/libxl.c --- a/tools/libxl/libxl.c Fri Jan 13 16:54:27 2012 +0000 +++ b/tools/libxl/libxl.c Fri Jan 13 16:54:27 2012 +0000 @@ -24,17 +24,17 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, unsigned flags, xentoollog_logger * lg) { - libxl_ctx *ctx; + libxl_ctx *ctx = NULL; struct stat stat_buf; const pthread_mutex_t mutex_value = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; - - if (version != LIBXL_VERSION) - return ERROR_VERSION; + int rc; + + if (version != LIBXL_VERSION) { rc = ERROR_VERSION; goto out; } ctx = malloc(sizeof(*ctx)); if (!ctx) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Failed to allocate context\n"); - return ERROR_NOMEM; + rc = ERROR_NOMEM; goto out; } memset(ctx, 0, sizeof(libxl_ctx)); @@ -48,14 +48,14 @@ if ( stat(XENSTORE_PID_FILE, &stat_buf) != 0 ) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Is xenstore daemon running?\n" "failed to stat %s", XENSTORE_PID_FILE); - return ERROR_FAIL; + rc = ERROR_FAIL; goto out; } ctx->xch = xc_interface_open(lg,lg,0); if (!ctx->xch) { LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, errno, "cannot open libxc handle"); - return ERROR_FAIL; + rc = ERROR_FAIL; goto out; } ctx->xsh = xs_daemon_open(); @@ -64,12 +64,16 @@ if (!ctx->xsh) { LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, errno, "cannot connect to xenstore"); - xc_interface_close(ctx->xch); - return ERROR_FAIL; + rc = ERROR_FAIL; goto out; } *pctx = ctx; return 0; + + out: + libxl_ctx_free(ctx); + *pctx = NULL; + return rc; } int libxl_ctx_free(libxl_ctx *ctx) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |