diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-02-10 00:16:53 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-02-10 00:16:53 +0100 |
commit | 30ed8dac34a5a8e097484fa581afa9eb12b2429f (patch) | |
tree | eb3b4525fc23f3b224323529652087db212cc65d /tools/xenstat | |
parent | f1e6a1060ad3f381d7c678b1d346afb1b183ba07 (diff) | |
download | xen-30ed8dac34a5a8e097484fa581afa9eb12b2429f.tar.gz xen-30ed8dac34a5a8e097484fa581afa9eb12b2429f.tar.bz2 xen-30ed8dac34a5a8e097484fa581afa9eb12b2429f.zip |
Check the hypercall number in the privcmd hypercall ioctl.
We check it is a member of a small set of permitted hypercalls.
Fix libxenstat to not use multicalls (not permitted, and not
need for efficiency in libxenstat).
Based on an original patch by Chris Wright.
Signed-off-by: Keir Fraser <keir@xensource.com>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
Diffstat (limited to 'tools/xenstat')
-rw-r--r-- | tools/xenstat/libxenstat/src/xen-interface.c | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/tools/xenstat/libxenstat/src/xen-interface.c b/tools/xenstat/libxenstat/src/xen-interface.c index 8c06449db3..6b6fa6b9fb 100644 --- a/tools/xenstat/libxenstat/src/xen-interface.c +++ b/tools/xenstat/libxenstat/src/xen-interface.c @@ -61,43 +61,40 @@ static int xi_make_xen_version_hypercall(xi_handle *handle, long *vnum, xen_extraversion_t *ver) { privcmd_hypercall_t privcmd; - multicall_entry_t multicall[2]; int ret = 0; - /* set up for doing hypercall */ - privcmd.op = __HYPERVISOR_multicall; - privcmd.arg[0] = (unsigned long)multicall; - privcmd.arg[1] = 2; - - /* first one to get xen version number */ - multicall[0].op = __HYPERVISOR_xen_version; - multicall[0].args[0] = (unsigned long)XENVER_version; - - /* second to get xen version flag */ - multicall[1].op = __HYPERVISOR_xen_version; - multicall[1].args[0] = (unsigned long)XENVER_extraversion; - multicall[1].args[1] = (unsigned long)ver; - - if (mlock( &privcmd, sizeof(privcmd_hypercall_t)) < 0) { + if (mlock(&privcmd, sizeof(privcmd)) < 0) { perror("Failed to mlock privcmd structure"); return -1; } - if (mlock( multicall, sizeof(multicall_entry_t)) < 0) { - perror("Failed to mlock multicall_entry structure"); - munlock( &multicall, sizeof(multicall_entry_t)); + if (mlock(ver, sizeof(*ver)) < 0) { + perror("Failed to mlock extraversion structure"); + munlock(&privcmd, sizeof(privcmd)); return -1; } - if (ioctl( handle->fd, IOCTL_PRIVCMD_HYPERCALL, &privcmd) < 0) { + privcmd.op = __HYPERVISOR_xen_version; + privcmd.arg[0] = (unsigned long)XENVER_version; + privcmd.arg[1] = 0; + + *vnum = ioctl(handle->fd, IOCTL_PRIVCMD_HYPERCALL, &privcmd); + if (*vnum < 0) { perror("Hypercall failed"); ret = -1; } - *vnum = multicall[0].result; + privcmd.op = __HYPERVISOR_xen_version; + privcmd.arg[0] = (unsigned long)XENVER_extraversion; + privcmd.arg[1] = (unsigned long)ver; - munlock( &privcmd, sizeof(privcmd_hypercall_t)); - munlock( &multicall, sizeof(multicall_entry_t)); + if (ioctl(handle->fd, IOCTL_PRIVCMD_HYPERCALL, &privcmd) < 0) { + perror("Hypercall failed"); + ret = -1; + } + + munlock(&privcmd, sizeof(privcmd)); + munlock(ver, sizeof(*ver)); return ret; } |