From: Ian Jackson Date: Wed, 24 Sep 2014 14:22:08 +0000 (+0100) Subject: libxl: Fix error handling in libxl_userdata_unlink X-Git-Tag: 4.5.0-rc1~68 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=9fe1ab70752d81a65b2a1492c46d9119438c0e9e;p=xen.git libxl: Fix error handling in libxl_userdata_unlink Previously: * rc would not be set before leaving the function, with the result that an uninitialised value would be returned * failures of libxl__userdata_path would result in a NULL dereference * failures of unlink() would not be usefully logged This appears to be due to an attempt to avoid having to repeat the call to libxl__unlock_domain_userdata by informally sharing parts of the success and failure paths. Change to use the canonical error-handling style: * Initialise lock to 0. * Do the unlock in the `out' section - always attempt to unlock lock if it is non-0. * Explicitly set rc and `goto out' on all error paths, even those right at the end of the function. * Add an error check for filename = libxl__userdata_path(...); Coverity-ID: 1240237, 1240235. CC: Wei Liu CC: coverity@xenproject.org Reviewed-by: Andrew Cooper Acked-by: Ian Campbell Signed-off-by: Ian Jackson --- diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index d63ae1bbd3..9d830e11bd 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -2243,12 +2243,12 @@ int libxl_userdata_unlink(libxl_ctx *ctx, uint32_t domid, const char *userdata_userid) { GC_INIT(ctx); - int rc; + CTX_LOCK; - libxl__domain_userdata_lock *lock; + int rc; + libxl__domain_userdata_lock *lock = NULL; const char *filename; - CTX_LOCK; lock = libxl__lock_domain_userdata(gc, domid); if (!lock) { rc = ERROR_LOCK_FAIL; @@ -2256,10 +2256,20 @@ int libxl_userdata_unlink(libxl_ctx *ctx, uint32_t domid, } filename = libxl__userdata_path(gc, domid, userdata_userid, "d"); - if (unlink(filename)) rc = ERROR_FAIL; + if (!filename) { + rc = ERROR_FAIL; + goto out; + } + if (unlink(filename)) { + LOGE(ERROR, "error deleting userdata file: %s", filename); + rc = ERROR_FAIL; + goto out; + } - libxl__unlock_domain_userdata(lock); + rc = 0; out: + if (lock) + libxl__unlock_domain_userdata(lock); CTX_UNLOCK; GC_FREE; return rc;