diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2018-10-12 10:02:28 -0400 |
|---|---|---|
| committer | Chris Wilson <chris@chris-wilson.co.uk> | 2018-10-15 07:52:03 -0400 |
| commit | a5e856a5348f6cd50889d125c40bbeec7328e466 (patch) | |
| tree | 6a4c060782afb331f4f549314e25acea26ecd33b /drivers/gpu/drm/i915 | |
| parent | 27d7aaae0fd7d7feb232f267c85370da04b593a4 (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.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 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, |
