drm/i915: Use expcitly fixed type in compat32 structs
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 14 Jul 2015 16:07:30 +0000 (18:07 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 15 Jul 2015 09:39:59 +0000 (11:39 +0200)
I was confused shortly whether the compat was needed for the int,
until I noticed the pointer in the original.

Also remove typedef.

v2: Review from Chris.
- Add comments.
- Also change the int param in the original structure.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_ioc32.c
include/uapi/drm/i915_drm.h

index 6eec222..a5a2d5b 100644 (file)
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
 
-typedef struct drm_i915_getparam32 {
-       int param;
+struct drm_i915_getparam32 {
+       s32 param;
+       /*
+        * We screwed up the generic ioctl struct here and used a variable-sized
+        * pointer. Use u32 in the compat struct to match the 32bit pointer
+        * userspace expects.
+        */
        u32 value;
-} drm_i915_getparam32_t;
+};
 
 static int compat_i915_getparam(struct file *file, unsigned int cmd,
                                unsigned long arg)
 {
-       drm_i915_getparam32_t req32;
+       struct drm_i915_getparam32 req32;
        drm_i915_getparam_t __user *request;
 
        if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
index e7c29f1..192027b 100644 (file)
@@ -358,7 +358,11 @@ typedef struct drm_i915_irq_wait {
 #define I915_PARAM_HAS_RESOURCE_STREAMER 36
 
 typedef struct drm_i915_getparam {
-       int param;
+       s32 param;
+       /*
+        * WARNING: Using pointers instead of fixed-size u64 means we need to write
+        * compat32 code. Don't repeat this mistake.
+        */
        int __user *value;
 } drm_i915_getparam_t;