diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0554-drm-amdgpu-make-UVD-handle-checking-more-strict.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0554-drm-amdgpu-make-UVD-handle-checking-more-strict.patch | 114 |
1 files changed, 0 insertions, 114 deletions
diff --git a/common/recipes-kernel/linux/files/0554-drm-amdgpu-make-UVD-handle-checking-more-strict.patch b/common/recipes-kernel/linux/files/0554-drm-amdgpu-make-UVD-handle-checking-more-strict.patch deleted file mode 100644 index 006d5fe2..00000000 --- a/common/recipes-kernel/linux/files/0554-drm-amdgpu-make-UVD-handle-checking-more-strict.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 5146419e6feb99cfbc8dbf005dd2f62603e15efb Mon Sep 17 00:00:00 2001 -From: Leo Liu <leo.liu@amd.com> -Date: Tue, 15 Sep 2015 10:38:38 -0400 -Subject: [PATCH 0554/1050] drm/amdgpu: make UVD handle checking more strict -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Invalid messages can crash the hw otherwise - -Ported from radeon commit a1b403da70e038ca6c6c6fe434d1d873546873a3 - -Signed-off-by: Leo Liu <leo.liu@amd.com> -Reviewed-by: Christian König <christian.koenig@amd.com> -Cc: stable@vger.kernel.org ---- - drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 68 ++++++++++++++++++++------------- - 1 file changed, 41 insertions(+), 27 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -index 1a8e43b..d0312364 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -@@ -543,46 +543,60 @@ static int amdgpu_uvd_cs_msg(struct amdgpu_uvd_cs_ctx *ctx, - return -EINVAL; - } - -- if (msg_type == 1) { -+ switch (msg_type) { -+ case 0: -+ /* it's a create msg, calc image size (width * height) */ -+ amdgpu_bo_kunmap(bo); -+ -+ /* try to alloc a new handle */ -+ for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { -+ if (atomic_read(&adev->uvd.handles[i]) == handle) { -+ DRM_ERROR("Handle 0x%x already in use!\n", handle); -+ return -EINVAL; -+ } -+ -+ if (!atomic_cmpxchg(&adev->uvd.handles[i], 0, handle)) { -+ adev->uvd.filp[i] = ctx->parser->filp; -+ return 0; -+ } -+ } -+ -+ DRM_ERROR("No more free UVD handles!\n"); -+ return -EINVAL; -+ -+ case 1: - /* it's a decode msg, calc buffer sizes */ - r = amdgpu_uvd_cs_msg_decode(msg, ctx->buf_sizes); - amdgpu_bo_kunmap(bo); - if (r) - return r; - -- } else if (msg_type == 2) { -+ /* validate the handle */ -+ for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { -+ if (atomic_read(&adev->uvd.handles[i]) == handle) { -+ if (adev->uvd.filp[i] != ctx->parser->filp) { -+ DRM_ERROR("UVD handle collision detected!\n"); -+ return -EINVAL; -+ } -+ return 0; -+ } -+ } -+ -+ DRM_ERROR("Invalid UVD handle 0x%x!\n", handle); -+ return -ENOENT; -+ -+ case 2: - /* it's a destroy msg, free the handle */ - for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) - atomic_cmpxchg(&adev->uvd.handles[i], handle, 0); - amdgpu_bo_kunmap(bo); - return 0; -- } else { -- /* it's a create msg */ -- amdgpu_bo_kunmap(bo); -- -- if (msg_type != 0) { -- DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); -- return -EINVAL; -- } -- -- /* it's a create msg, no special handling needed */ -- } -- -- /* create or decode, validate the handle */ -- for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { -- if (atomic_read(&adev->uvd.handles[i]) == handle) -- return 0; -- } - -- /* handle not found try to alloc a new one */ -- for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { -- if (!atomic_cmpxchg(&adev->uvd.handles[i], 0, handle)) { -- adev->uvd.filp[i] = ctx->parser->filp; -- return 0; -- } -+ default: -+ DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); -+ return -EINVAL; - } -- -- DRM_ERROR("No more free UVD handles!\n"); -+ BUG(); - return -EINVAL; - } - --- -1.9.1 - |