diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-11-14 06:29:30 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-11-18 15:51:53 -0500 |
commit | b17993b7b29612369270567643bcff814f4b3d7f (patch) | |
tree | 4d2f3fdbc2b7d2a494ef79f6b5dcffecd71dbcb7 | |
parent | 786d290cae849a8fc1145e969bfb0953072e3fc7 (diff) |
drm/i915: Don't touch NULL sg on i915_gem_object_get_pages_gtt() error
On the DMA mapping error path, sg may be NULL (it has already been
marked as the last scatterlist entry), and we should avoid dereferencing
it again.
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Fixes: e227330223a7 ("drm/i915: avoid leaking DMA mappings")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Imre Deak <imre.deak@intel.com>
Cc: stable@vger.kernel.org
Link: http://patchwork.freedesktop.org/patch/msgid/20161114112930.2033-1-chris@chris-wilson.co.uk
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index d5b7723bb028..4500731fed10 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -2386,7 +2386,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
2386 | page = shmem_read_mapping_page(mapping, i); | 2386 | page = shmem_read_mapping_page(mapping, i); |
2387 | if (IS_ERR(page)) { | 2387 | if (IS_ERR(page)) { |
2388 | ret = PTR_ERR(page); | 2388 | ret = PTR_ERR(page); |
2389 | goto err_pages; | 2389 | goto err_sg; |
2390 | } | 2390 | } |
2391 | } | 2391 | } |
2392 | if (!i || | 2392 | if (!i || |
@@ -2419,8 +2419,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
2419 | 2419 | ||
2420 | return st; | 2420 | return st; |
2421 | 2421 | ||
2422 | err_pages: | 2422 | err_sg: |
2423 | sg_mark_end(sg); | 2423 | sg_mark_end(sg); |
2424 | err_pages: | ||
2424 | for_each_sgt_page(page, sgt_iter, st) | 2425 | for_each_sgt_page(page, sgt_iter, st) |
2425 | put_page(page); | 2426 | put_page(page); |
2426 | sg_free_table(st); | 2427 | sg_free_table(st); |