[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] libxl: Fix error handling in libxl_userdata_unlink



commit 9fe1ab70752d81a65b2a1492c46d9119438c0e9e
Author:     Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
AuthorDate: Wed Sep 24 15:22:08 2014 +0100
Commit:     Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CommitDate: Wed Oct 8 11:51:37 2014 +0100

    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 <wei.liu2@xxxxxxxxxx>
    CC: coverity@xxxxxxxxxxxxxx
    Reviewed-by: Andrew Cooper<andrew.cooper3@xxxxxxxxxx>
    Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
    Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
 tools/libxl/libxl_dom.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index d63ae1b..9d830e1 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;
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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