On Thu, Dec 17, 2009 at 12:44:55PM -0700, David Stevens wrote:
> VHOST_GET_FEATURES returns high-order garbage on 32-bit
> machines. This patch fixes it to use 64 bits throughout.
> 
>                                         +-DLS
> 
> [in-line for viewing, attached to avoid whitespace mangling]
> 
> Signed-off-by: David L Stevens <dlstev...@us.ibm.com>
> 
> --- a/drivers/vhost/net.c       2009-11-17 22:51:56.000000000 -0800
> +++ b/drivers/vhost/net.c       2009-12-17 11:31:51.000000000 -0800
> @@ -563,7 +563,7 @@
>  {
>         struct vhost_net *n = f->private_data;
>         void __user *argp = (void __user *)arg;
> -       u32 __user *featurep = argp;
> +       u64 __user *featurep = (u64 __user *)argp;
>         struct vhost_vring_file backend;
>         u64 features;
>         int r;
> @@ -577,7 +577,7 @@
>                 features = VHOST_FEATURES;
>                 return put_user(features, featurep);
>         case VHOST_SET_FEATURES:
> -               r = get_user(features, featurep);
> +               r = copy_from_user(&features, featurep, sizeof features);
>                 /* No features for now */
>                 if (r < 0)
>                         return r;
> 

Thanks very much for the report and the patch.
I tweaked the description and the code a bit (both GET and SET need
to be fixed). Could you pls approve this still works for you as well?  Also,
out of interest, could you please share which application and on which
platform are you using vhost net? Thanks!

--->
Subject: vhost: fix high 32 bit in FEATURES ioctls

VHOST_GET_FEATURES fails to initialize high-order 32 bits
in the returned value, and VHOST_SET_FEATURES fails to check them.
This patch fixes it to use 64 bits throughout.

Signed-off-by: David L Stevens <dlstev...@us.ibm.com>
Signed-off-by: Michael S. Tsirkin <m...@redhat.com>

---

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 22d5fef..d6db10c 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -563,7 +563,7 @@ static long vhost_net_ioctl(struct file *f, unsigned int 
ioctl,
 {
        struct vhost_net *n = f->private_data;
        void __user *argp = (void __user *)arg;
-       u32 __user *featurep = argp;
+       u64 __user *featurep = argp;
        struct vhost_vring_file backend;
        u64 features;
        int r;
@@ -575,10 +575,9 @@ static long vhost_net_ioctl(struct file *f, unsigned int 
ioctl,
                return vhost_net_set_backend(n, backend.index, backend.fd);
        case VHOST_GET_FEATURES:
                features = VHOST_FEATURES;
-               return put_user(features, featurep);
+               return copy_to_user(featurep, &features, sizeof features);
        case VHOST_SET_FEATURES:
-               r = get_user(features, featurep);
-               /* No features for now */
+               r = copy_from_user(&features, featurep, sizeof features);
                if (r < 0)
                        return r;
                if (features & ~VHOST_FEATURES)
-- 
MST
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to