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

[Xen-changelog] Make sure we save errno across error-path printfs and munlocks. Based



ChangeSet 1.1733, 2005/06/23 09:40:39+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Make sure we save errno across error-path printfs and munlocks. Based
        on a patch from Anthony Liguori.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 xc_domain.c  |    8 ++------
 xc_evtchn.c  |    2 +-
 xc_gnttab.c  |    2 +-
 xc_misc.c    |    2 +-
 xc_private.c |   14 +++++++++-----
 xc_private.h |   44 +++++++++++++++++++++++++-------------------
 6 files changed, 39 insertions(+), 33 deletions(-)


diff -Nru a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c   2005-06-23 05:03:36 -04:00
+++ b/tools/libxc/xc_domain.c   2005-06-23 05:03:36 -04:00
@@ -128,7 +128,7 @@
                                u32 vcpu,
                                vcpu_guest_context_t *ctxt)
 {
-    int rc, errno_saved;
+    int rc;
     dom0_op_t op;
 
     op.cmd = DOM0_GETVCPUCONTEXT;
@@ -143,11 +143,7 @@
     rc = do_dom0_op(xc_handle, &op);
 
     if ( ctxt != NULL )
-    {
-        errno_saved = errno;
-        (void)munlock(ctxt, sizeof(*ctxt));
-        errno = errno_saved;
-    }
+        safe_munlock(ctxt, sizeof(*ctxt));
 
     if ( rc > 0 )
         return -ESRCH;
diff -Nru a/tools/libxc/xc_evtchn.c b/tools/libxc/xc_evtchn.c
--- a/tools/libxc/xc_evtchn.c   2005-06-23 05:03:36 -04:00
+++ b/tools/libxc/xc_evtchn.c   2005-06-23 05:03:36 -04:00
@@ -26,7 +26,7 @@
     if ((ret = do_xen_hypercall(xc_handle, &hypercall)) < 0)
         ERROR("do_evtchn_op: HYPERVISOR_event_channel_op failed: %d", ret);
 
-    (void)munlock(op, sizeof(*op));
+    safe_munlock(op, sizeof(*op));
  out:
     return ret;
 }
diff -Nru a/tools/libxc/xc_gnttab.c b/tools/libxc/xc_gnttab.c
--- a/tools/libxc/xc_gnttab.c   2005-06-23 05:03:36 -04:00
+++ b/tools/libxc/xc_gnttab.c   2005-06-23 05:03:36 -04:00
@@ -33,7 +33,7 @@
     if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
         ERROR("do_gnttab_op: HYPERVISOR_grant_table_op failed: %d", ret);
 
-    (void)munlock(op, sizeof(*op));
+    safe_munlock(op, sizeof(*op));
  out:
     return ret;
 }
diff -Nru a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c     2005-06-23 05:03:36 -04:00
+++ b/tools/libxc/xc_misc.c     2005-06-23 05:03:36 -04:00
@@ -43,7 +43,7 @@
         *pnr_chars = op.u.readconsole.count;
     }
 
-    (void)munlock(buffer, nr_chars);
+    safe_munlock(buffer, nr_chars);
 
     return ret;
 }    
diff -Nru a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c  2005-06-23 05:03:36 -04:00
+++ b/tools/libxc/xc_private.c  2005-06-23 05:03:36 -04:00
@@ -22,8 +22,10 @@
     ioctlx.arr=arr;
     if ( ioctl( xc_handle, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx ) < 0 )
     {
+        int saved_errno = errno;
        perror("XXXXXXXX");
-       munmap(addr, num*PAGE_SIZE);
+       (void)munmap(addr, num*PAGE_SIZE);
+        errno = saved_errno;
        return NULL;
     }
     return addr;
@@ -51,7 +53,9 @@
     entry.npages=(size+PAGE_SIZE-1)>>PAGE_SHIFT;
     if ( ioctl( xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx ) < 0 )
     {
-       munmap(addr, size);
+        int saved_errno = errno;
+       (void)munmap(addr, size);
+        errno = saved_errno;
        return NULL;
     }
     return addr;
@@ -134,8 +138,8 @@
     }
 
     mmu->idx = 0;
-    
-    (void)munlock(mmu->updates, sizeof(mmu->updates));
+
+    safe_munlock(mmu->updates, sizeof(mmu->updates));
 
  out:
     return err;
@@ -232,7 +236,7 @@
 
     ret = do_dom0_op(xc_handle, &op);
 
-    (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
+    safe_munlock(pfn_buf, max_pfns * sizeof(unsigned long));
 
 #if 0
 #ifdef DEBUG
diff -Nru a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h
--- a/tools/libxc/xc_private.h  2005-06-23 05:03:36 -04:00
+++ b/tools/libxc/xc_private.h  2005-06-23 05:03:36 -04:00
@@ -101,12 +101,28 @@
     loadimagefunc loadimage;
 };
 
-#define ERROR(_m, _a...)  \
-    fprintf(stderr, "ERROR: " _m "\n" , ## _a )
+#define ERROR(_m, _a...)                                \
+do {                                                    \
+    int __saved_errno = errno;                          \
+    fprintf(stderr, "ERROR: " _m "\n" , ## _a );        \
+    errno = __saved_errno;                              \
+} while (0)
+
+
+#define PERROR(_m, _a...)                                       \
+do {                                                            \
+    int __saved_errno = errno;                                  \
+    fprintf(stderr, "ERROR: " _m " (%d = %s)\n" , ## _a ,       \
+            __saved_errno, strerror(__saved_errno));            \
+    errno = __saved_errno;                                      \
+} while (0)
 
-#define PERROR(_m, _a...) \
-    fprintf(stderr, "ERROR: " _m " (%d = %s)\n" , ## _a , \
-            errno, strerror(errno))
+static inline void safe_munlock(const void *addr, size_t len)
+{
+    int saved_errno = errno;
+    (void)munlock(addr, len);
+    errno = saved_errno;
+}
 
 static inline int do_privcmd(int xc_handle,
                              unsigned int cmd, 
@@ -125,7 +141,7 @@
 
 static inline int do_dom0_op(int xc_handle, dom0_op_t *op)
 {
-    int ret = -1, errno_saved;
+    int ret = -1;
     privcmd_hypercall_t hypercall;
 
     op->interface_version = DOM0_INTERFACE_VERSION;
@@ -146,9 +162,7 @@
                     " rebuild the user-space tool set?\n");
     }
 
-    errno_saved = errno;
-    (void)munlock(op, sizeof(*op));
-    errno = errno_saved;
+    safe_munlock(op, sizeof(*op));
 
  out1:
     return ret;
@@ -163,7 +177,6 @@
 {
     privcmd_hypercall_t hypercall;
     long ret = -EINVAL;
-    int errno_saved;
 
     hypercall.op     = __HYPERVISOR_dom_mem_op;
     hypercall.arg[0] = (unsigned long)memop;
@@ -186,11 +199,7 @@
     }
 
     if ( extent_list != NULL )
-    {
-        errno_saved = errno;
-        (void)munlock(extent_list, nr_extents*sizeof(unsigned long));
-        errno = errno_saved;
-    }
+        safe_munlock(extent_list, nr_extents*sizeof(unsigned long));
 
  out1:
     return ret;
@@ -204,7 +213,6 @@
 {
     privcmd_hypercall_t hypercall;
     long ret = -EINVAL;
-    int errno_saved;
 
     hypercall.op     = __HYPERVISOR_mmuext_op;
     hypercall.arg[0] = (unsigned long)op;
@@ -224,9 +232,7 @@
                     " rebuild the user-space tool set?\n",ret,errno);
     }
 
-    errno_saved = errno;
-    (void)munlock(op, nr_ops*sizeof(*op));
-    errno = errno_saved;
+    safe_munlock(op, nr_ops*sizeof(*op));
 
  out1:
     return ret;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
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®.