diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2015-09-23 07:00:35 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-09-23 17:23:44 -0400 |
commit | 0913eab648e4fb30ddca8882e707d0fcf5b237c6 (patch) | |
tree | 7530627890f1194b61d0e8ba57eefcc5e42ab59d /drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |
parent | 0d2edd3791bb172a59d708d5c94330bbd6050f97 (diff) |
drm/amdgpu: info leak in amdgpu_gem_metadata_ioctl()
There is no limit on args->data.data_size_bytes so we could read beyond
the end of the args->data.data[] array.
Reviewed-by: Christian König <christian.koenig@amd.com>
Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 2f39fea10bd1..b82fab2cc888 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -427,6 +427,10 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, | |||
427 | &args->data.data_size_bytes, | 427 | &args->data.data_size_bytes, |
428 | &args->data.flags); | 428 | &args->data.flags); |
429 | } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { | 429 | } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { |
430 | if (args->data.data_size_bytes > sizeof(args->data.data)) { | ||
431 | r = -EINVAL; | ||
432 | goto unreserve; | ||
433 | } | ||
430 | r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); | 434 | r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); |
431 | if (!r) | 435 | if (!r) |
432 | r = amdgpu_bo_set_metadata(robj, args->data.data, | 436 | r = amdgpu_bo_set_metadata(robj, args->data.data, |
@@ -434,6 +438,7 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, | |||
434 | args->data.flags); | 438 | args->data.flags); |
435 | } | 439 | } |
436 | 440 | ||
441 | unreserve: | ||
437 | amdgpu_bo_unreserve(robj); | 442 | amdgpu_bo_unreserve(robj); |
438 | out: | 443 | out: |
439 | drm_gem_object_unreference_unlocked(gobj); | 444 | drm_gem_object_unreference_unlocked(gobj); |