Skip to content

Commit

Permalink
drm/i915: Sanity check pread/pwrite
Browse files Browse the repository at this point in the history
Move the access control up from the fast paths, which are no longer
universally taken first, up into the caller. This then duplicates some
sanity checking along the slow paths, but is much simpler.
Tracked as CVE-2010-2962.

Reported-by: Kees Cook <kees@ubuntu.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@kernel.org
  • Loading branch information
Chris Wilson committed Oct 3, 2010
1 parent ab7ad7f commit ce9d419
Showing 1 changed file with 20 additions and 8 deletions.
28 changes: 20 additions & 8 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -477,8 +477,15 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
*/
if (args->offset > obj->size || args->size > obj->size ||
args->offset + args->size > obj->size) {
drm_gem_object_unreference_unlocked(obj);
return -EINVAL;
ret = -EINVAL;
goto err;
}

if (!access_ok(VERIFY_WRITE,
(char __user *)(uintptr_t)args->data_ptr,
args->size)) {
ret = -EFAULT;
goto err;
}

if (i915_gem_object_needs_bit17_swizzle(obj)) {
Expand All @@ -490,8 +497,8 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
file_priv);
}

err:
drm_gem_object_unreference_unlocked(obj);

return ret;
}

Expand Down Expand Up @@ -580,8 +587,6 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj,

user_data = (char __user *) (uintptr_t) args->data_ptr;
remain = args->size;
if (!access_ok(VERIFY_READ, user_data, remain))
return -EFAULT;


mutex_lock(&dev->struct_mutex);
Expand Down Expand Up @@ -940,8 +945,15 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
*/
if (args->offset > obj->size || args->size > obj->size ||
args->offset + args->size > obj->size) {
drm_gem_object_unreference_unlocked(obj);
return -EINVAL;
ret = -EINVAL;
goto err;
}

if (!access_ok(VERIFY_READ,
(char __user *)(uintptr_t)args->data_ptr,
args->size)) {
ret = -EFAULT;
goto err;
}

/* We can only do the GTT pwrite on untiled buffers, as otherwise
Expand Down Expand Up @@ -975,8 +987,8 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
DRM_INFO("pwrite failed %d\n", ret);
#endif

err:
drm_gem_object_unreference_unlocked(obj);

return ret;
}

Expand Down

0 comments on commit ce9d419

Please sign in to comment.