# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxxxx>
# Date 1301756069 -3600
# Node ID 0bee20f8e418d32ab5828eb57c7542ca27ce425d
# Parent 8fe973d8fb987640dff885169bc64c7e7be3a772
xenbus: fix type inconsistency with xenbus_conn()
Its (bogus) declaration in xenbus_dev.c was inconsistent with the
actual implementation, leaving room for stack corruption on 64-bit
systems. Thus move the declaration to a header included by both
parties, and use proper types for the parameters.
Additionally, the function is needed on privileged kernels only, and
hence neither the potentially forward-incompatible HAVE_UNLOCKED_IOCTL
conditionals in xenbus_dev.c are needed, nor does the function (and
its helper) need to be compiled in unprivileged builds.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
diff -r 8fe973d8fb98 -r 0bee20f8e418 drivers/xen/xenbus/xenbus_comms.h
--- a/drivers/xen/xenbus/xenbus_comms.h Fri Mar 11 16:18:59 2011 +0000
+++ b/drivers/xen/xenbus/xenbus_comms.h Sat Apr 02 15:54:29 2011 +0100
@@ -59,4 +59,11 @@
return s == XENBUS_XSD_FOREIGN_READY || s == XENBUS_XSD_LOCAL_READY;
}
+#if defined(CONFIG_XEN_XENBUS_DEV) && defined(CONFIG_XEN_PRIVILEGED_GUEST)
+#include <xen/interface/event_channel.h>
+#include <xen/interface/grant_table.h>
+
+int xenbus_conn(domid_t, grant_ref_t *, evtchn_port_t *);
+#endif
+
#endif /* _XENBUS_COMMS_H */
diff -r 8fe973d8fb98 -r 0bee20f8e418 drivers/xen/xenbus/xenbus_dev.c
--- a/drivers/xen/xenbus/xenbus_dev.c Fri Mar 11 16:18:59 2011 +0000
+++ b/drivers/xen/xenbus/xenbus_dev.c Sat Apr 02 15:54:29 2011 +0100
@@ -395,12 +395,10 @@
return 0;
}
-#ifdef HAVE_UNLOCKED_IOCTL
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
static long xenbus_dev_ioctl(struct file *file,
unsigned int cmd, unsigned long data)
{
- extern int xenbus_conn(domid_t remote_dom, int *grant_ref,
- evtchn_port_t *local_port);
void __user *udata = (void __user *) data;
int ret = -ENOTTY;
@@ -453,7 +451,7 @@
.open = xenbus_dev_open,
.release = xenbus_dev_release,
.poll = xenbus_dev_poll,
-#ifdef HAVE_UNLOCKED_IOCTL
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
.unlocked_ioctl = xenbus_dev_ioctl
#endif
};
diff -r 8fe973d8fb98 -r 0bee20f8e418 drivers/xen/xenbus/xenbus_probe.c
--- a/drivers/xen/xenbus/xenbus_probe.c Fri Mar 11 16:18:59 2011 +0000
+++ b/drivers/xen/xenbus/xenbus_probe.c Sat Apr 02 15:54:29 2011 +0100
@@ -871,7 +871,8 @@
}
-#if defined(CONFIG_PROC_FS) && defined(CONFIG_XEN_PRIVILEGED_GUEST)
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
+#ifdef CONFIG_PROC_FS
static struct file_operations xsd_kva_fops;
static struct proc_dir_entry *xsd_kva_intf;
static struct proc_dir_entry *xsd_port_intf;
@@ -933,6 +934,7 @@
}
#endif
+#ifdef CONFIG_XEN_XENBUS_DEV
static int xb_free_port(evtchn_port_t port)
{
struct evtchn_close close;
@@ -940,7 +942,8 @@
return HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
}
-int xenbus_conn(domid_t remote_dom, unsigned long *grant_ref, evtchn_port_t
*local_port)
+int xenbus_conn(domid_t remote_dom, grant_ref_t *grant_ref,
+ evtchn_port_t *local_port)
{
struct evtchn_alloc_unbound alloc_unbound;
int rc, rc2;
@@ -948,10 +951,8 @@
BUG_ON(atomic_read(&xenbus_xsd_state) != XENBUS_XSD_FOREIGN_INIT);
BUG_ON(!is_initial_xendomain());
-#if defined(CONFIG_PROC_FS) && defined(CONFIG_XEN_PRIVILEGED_GUEST)
remove_xen_proc_entry("xsd_kva");
remove_xen_proc_entry("xsd_port");
-#endif
rc = xb_free_port(xen_store_evtchn);
if (rc != 0)
@@ -988,6 +989,8 @@
xen_store_evtchn = -1;
return rc;
}
+#endif
+#endif /* CONFIG_XEN_PRIVILEGED_GUEST */
static int xenbus_probe_init(void)
{
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|