aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-10-12 10:02:28 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2018-10-15 07:52:03 -0400
commita5e856a5348f6cd50889d125c40bbeec7328e466 (patch)
tree6a4c060782afb331f4f549314e25acea26ecd33b /drivers/gpu/drm/i915
parent27d7aaae0fd7d7feb232f267c85370da04b593a4 (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
Diffstat (limited to 'drivers/gpu/drm/i915')
-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 7d45e71100bc..93d09282710d 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,