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
|