CHROMIUM: virtwl: change VIRTWL_SEND_MAX_ALLOCS to match libwayland
This is a breaking change and needs to be checked in lockstep with guest
proxy changes.
While we're breaking things, this fixes inconsistent uint*_t type usage
and makes virtwl_ioctl_new 32/64 bit safe.
BUG=chromium:782474
TEST=None
Change-Id: Ifbdb03d3d7b92dd6187f5d29d1e4a7d6d63b4415
Signed-off-by: Zach Reizner <zachr@google.com>
Reviewed-on: https://chromium-review.googlesource.com/770594
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/780816
Commit-Ready: Dylan Reid <dgreid@chromium.org>
Tested-by: Dylan Reid <dgreid@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
diff --git a/drivers/virtio/virtio_wl.c b/drivers/virtio/virtio_wl.c
index df9f190..0e3159d 100644
--- a/drivers/virtio/virtio_wl.c
+++ b/drivers/virtio/virtio_wl.c
@@ -882,13 +882,13 @@
static long virtwl_ioctl_send(struct file *filp, unsigned long arg)
{
struct virtwl_vfd *vfd = filp->private_data;
- struct virtwl_ioctl_send ioctl_send;
+ struct virtwl_ioctl_txn ioctl_send;
void __user *user_data = (void __user *)arg +
- sizeof(struct virtwl_ioctl_send);
+ sizeof(struct virtwl_ioctl_txn);
int ret;
ret = copy_from_user(&ioctl_send, (void __user *)arg,
- sizeof(struct virtwl_ioctl_send));
+ sizeof(struct virtwl_ioctl_txn));
if (ret)
return -EFAULT;
@@ -903,9 +903,9 @@
static long virtwl_ioctl_recv(struct file *filp, unsigned long arg)
{
- struct virtwl_ioctl_recv ioctl_recv;
+ struct virtwl_ioctl_txn ioctl_recv;
void __user *user_data = (void __user *)arg +
- sizeof(struct virtwl_ioctl_recv);
+ sizeof(struct virtwl_ioctl_txn);
int __user *user_fds = (int __user *)arg;
size_t vfd_count = VIRTWL_SEND_MAX_ALLOCS;
struct virtwl_vfd *vfds[VIRTWL_SEND_MAX_ALLOCS] = { 0 };
@@ -918,7 +918,7 @@
fds[i] = -1;
ret = copy_from_user(&ioctl_recv, (void __user *)arg,
- sizeof(struct virtwl_ioctl_recv));
+ sizeof(struct virtwl_ioctl_txn));
if (ret)
return -EFAULT;
@@ -932,7 +932,7 @@
if (ret < 0)
return ret;
- ret = copy_to_user(&((struct virtwl_ioctl_recv __user *)arg)->len, &ret,
+ ret = copy_to_user(&((struct virtwl_ioctl_txn __user *)arg)->len, &ret,
sizeof(ioctl_recv.len));
if (ret) {
ret = -EFAULT;
diff --git a/include/uapi/linux/virtwl.h b/include/uapi/linux/virtwl.h
index cde61c0..8374dd6 100644
--- a/include/uapi/linux/virtwl.h
+++ b/include/uapi/linux/virtwl.h
@@ -2,8 +2,9 @@
#define _LINUX_VIRTWL_H
#include <asm/ioctl.h>
+#include <linux/types.h>
-#define VIRTWL_SEND_MAX_ALLOCS 16
+#define VIRTWL_SEND_MAX_ALLOCS 28
#define VIRTWL_IOCTL_BASE 'w'
#define VIRTWL_IO(nr) _IO(VIRTWL_IOCTL_BASE, nr)
@@ -12,32 +13,26 @@
#define VIRTWL_IOWR(nr, type) _IOWR(VIRTWL_IOCTL_BASE, nr, type)
enum virtwl_ioctl_new_type {
- VIRTWL_IOCTL_NEW_CTX, // struct virtwl_ioctl_new
- VIRTWL_IOCTL_NEW_ALLOC, // struct virtwl_ioctl_new_alloc
+ VIRTWL_IOCTL_NEW_CTX, /* open a new wayland connection context */
+ VIRTWL_IOCTL_NEW_ALLOC, /* create a new virtwl shm allocation */
};
struct virtwl_ioctl_new {
- uint32_t type; // always 0
- int fd; // return fd
- uint32_t flags; // always 0
- size_t size; // only for VIRTWL_IOCTL_NEW_ALLOC
+ __u32 type; /* VIRTWL_IOCTL_NEW_* */
+ int fd; /* return fd */
+ __u32 flags; /* currently always 0 */
+ __u32 size; /* size of allocation if type == VIRTWL_IOCTL_NEW_ALLOC */
};
-struct virtwl_ioctl_send {
+struct virtwl_ioctl_txn {
int fds[VIRTWL_SEND_MAX_ALLOCS];
- uint32_t len;
- uint8_t data[0];
-};
-
-struct virtwl_ioctl_recv {
- int fds[VIRTWL_SEND_MAX_ALLOCS];
- uint32_t len;
- uint8_t data[0];
+ __u32 len;
+ __u8 data[0];
};
#define VIRTWL_IOCTL_NEW VIRTWL_IOWR(0x00, struct virtwl_ioctl_new)
-#define VIRTWL_IOCTL_SEND VIRTWL_IOR(0x01, struct virtwl_ioctl_send)
-#define VIRTWL_IOCTL_RECV VIRTWL_IOW(0x02, struct virtwl_ioctl_recv)
+#define VIRTWL_IOCTL_SEND VIRTWL_IOR(0x01, struct virtwl_ioctl_txn)
+#define VIRTWL_IOCTL_RECV VIRTWL_IOW(0x02, struct virtwl_ioctl_txn)
#define VIRTWL_IOCTL_MAXNR 3
#endif /* _LINUX_VIRTWL_H */