aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-10-12 10:02:28 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2018-10-17 21:24:05 -0400
commitab0d6a141843e0b4b2709dfd37b53468b5452c3a (patch)
tree9d7d6993c3b994092da55c07e27ad064eaea7796
parente3118a038dfd1d6d902ea966e0ce3ce4e91e503b (diff)
drm/i915: Large page offsets for pread/pwrite
Handle integer overflow when computing the sub-page length for shmem backed pread/pwrite. Reported-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: stable@vger.kernel.org Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181012140228.29783-1-chris@chris-wilson.co.uk (cherry picked from commit a5e856a5348f6cd50889d125c40bbeec7328e466) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c12
1 files changed, 2 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index db9688d14912..aa3969d52773 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1127,11 +1127,7 @@ i915_gem_shmem_pread(struct drm_i915_gem_object *obj,
1127 offset = offset_in_page(args->offset); 1127 offset = offset_in_page(args->offset);
1128 for (idx = args->offset >> PAGE_SHIFT; remain; idx++) { 1128 for (idx = args->offset >> PAGE_SHIFT; remain; idx++) {
1129 struct page *page = i915_gem_object_get_page(obj, idx); 1129 struct page *page = i915_gem_object_get_page(obj, idx);
1130 int length; 1130 unsigned int length = min_t(u64, remain, PAGE_SIZE - offset);
1131
1132 length = remain;
1133 if (offset + length > PAGE_SIZE)
1134 length = PAGE_SIZE - offset;
1135 1131
1136 ret = shmem_pread(page, offset, length, user_data, 1132 ret = shmem_pread(page, offset, length, user_data,
1137 page_to_phys(page) & obj_do_bit17_swizzling, 1133 page_to_phys(page) & obj_do_bit17_swizzling,
@@ -1575,11 +1571,7 @@ i915_gem_shmem_pwrite(struct drm_i915_gem_object *obj,
1575 offset = offset_in_page(args->offset); 1571 offset = offset_in_page(args->offset);
1576 for (idx = args->offset >> PAGE_SHIFT; remain; idx++) { 1572 for (idx = args->offset >> PAGE_SHIFT; remain; idx++) {
1577 struct page *page = i915_gem_object_get_page(obj, idx); 1573 struct page *page = i915_gem_object_get_page(obj, idx);
1578 int length; 1574 unsigned int length = min_t(u64, remain, PAGE_SIZE - offset);
1579
1580 length = remain;
1581 if (offset + length > PAGE_SIZE)
1582 length = PAGE_SIZE - offset;
1583 1575
1584 ret = shmem_pwrite(page, offset, length, user_data, 1576 ret = shmem_pwrite(page, offset, length, user_data,
1585 page_to_phys(page) & obj_do_bit17_swizzling, 1577 page_to_phys(page) & obj_do_bit17_swizzling,