aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIan Jackson <ian.jackson@eu.citrix.com>2012-01-13 16:54:27 +0000
committerIan Jackson <ian.jackson@eu.citrix.com>2012-01-13 16:54:27 +0000
commita54239be9af2a50e9e849e3f7da8193256ad39bc (patch)
tree1edfe7fe7d7852306a1e0a1735853170ff537d50 /tools
parent2fe29aed9d328641cdc50ffdb013193883bf2f0a (diff)
downloadxen-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.c20
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)