diff options
author | Ian Jackson <ian.jackson@eu.citrix.com> | 2012-01-13 16:54:27 +0000 |
---|---|---|
committer | Ian Jackson <ian.jackson@eu.citrix.com> | 2012-01-13 16:54:27 +0000 |
commit | a54239be9af2a50e9e849e3f7da8193256ad39bc (patch) | |
tree | 1edfe7fe7d7852306a1e0a1735853170ff537d50 /tools | |
parent | 2fe29aed9d328641cdc50ffdb013193883bf2f0a (diff) | |
download | xen-a54239be9af2a50e9e849e3f7da8193256ad39bc.tar.gz xen-a54239be9af2a50e9e849e3f7da8193256ad39bc.tar.bz2 xen-a54239be9af2a50e9e849e3f7da8193256ad39bc.zip |
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@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libxl/libxl.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 6e3c5a872d..169fc97781 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -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; + int rc; - if (version != LIBXL_VERSION) - return ERROR_VERSION; + 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 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, 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 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, 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) |