diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2018-10-12 10:02:28 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-10-17 21:24:05 -0400 |
commit | ab0d6a141843e0b4b2709dfd37b53468b5452c3a (patch) | |
tree | 9d7d6993c3b994092da55c07e27ad064eaea7796 | |
parent | e3118a038dfd1d6d902ea966e0ce3ce4e91e503b (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.c | 12 |
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, |