Patch "drm/radeon: make UVD handle checking more strict" has been added to the 3.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/radeon: make UVD handle checking more strict
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-radeon-make-uvd-handle-checking-more-strict.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
a1b403da70e038ca6c6c6fe434d1d873546873a3Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <[email protected]>
Date: Thu, 7 May 2015 15:19:23 +0200
Subject: drm/radeon: make UVD handle checking more strict
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <[email protected]>
commit a1b403da70e038ca6c6c6fe434d1d873546873a3 upstream.
Invalid messages can crash the hw otherwise.
--- drivers/gpu/drm/radeon/radeon_uvd.c | 72 +++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 29 deletions(-)
drivers/gpu/drm/radeon/radeon_uvd.c +43 -29
@@ -388,50 +388,64 @@ static int radeon_uvd_cs_msg(struct radereturn -EINVAL ; } -if (msg_type ==1 ) { +switch (msg_type) { +case 0 : +/* it's a create msg, calc image size (width * height) */ + img_size = msg[7 ] * msg[8 ]; +radeon_bo_kunmap (bo); + +/* try to alloc a new handle */ +for (i =0 ; i <RADEON_MAX_UVD_HANDLES ; ++i) { +if (atomic_read (&p->rdev->uvd.handles[i]) == handle) { +DRM_ERROR ("Handle 0x%x already in use!\n" , handle); +return -EINVAL ; + } + +if (!atomic_cmpxchg (&p->rdev->uvd.handles[i],0 , handle)) { + p->rdev->uvd.filp[i] = p->filp; + p->rdev->uvd.img_size[i] = img_size; +return 0 ; + } + } + +DRM_ERROR ("No more free UVD handles!\n" ); +return -EINVAL ; + +case 1 :/* it's a decode msg, calc buffer sizes */ r =radeon_uvd_cs_msg_decode (msg, buf_sizes); -/* calc image size (width * height) */ - img_size = msg[6 ] * msg[7 ];radeon_bo_kunmap (bo);if (r)return r; - }else if (msg_type ==2 ) { +/* validate the handle */ +for (i =0 ; i <RADEON_MAX_UVD_HANDLES ; ++i) { +if (atomic_read (&p->rdev->uvd.handles[i]) == handle) { +if (p->rdev->uvd.filp[i] != p->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 <RADEON_MAX_UVD_HANDLES ; ++i)atomic_cmpxchg (&p->rdev->uvd.handles[i], handle,0 );radeon_bo_kunmap (bo);return 0 ; - }else { -/* it's a create msg, calc image size (width * height) */ - img_size = msg[7 ] * msg[8 ]; -radeon_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 <RADEON_MAX_UVD_HANDLES ; ++i) { -if (atomic_read (&p->rdev->uvd.handles[i]) == handle) -return 0 ; - } +default : -/* handle not found try to alloc a new one */ -for (i =0 ; i <RADEON_MAX_UVD_HANDLES ; ++i) { -if (!atomic_cmpxchg (&p->rdev->uvd.handles[i],0 , handle)) { - p->rdev->uvd.filp[i] = p->filp; - p->rdev->uvd.img_size[i] = img_size; -return 0 ; - } +DRM_ERROR ("Illegal UVD message type (%d)!\n" , msg_type); +return -EINVAL ; } -DRM_ERROR ("No more free UVD handles!\n" ); +BUG ();return -EINVAL ; }
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/drm-radeon-more-strictly-validate-the-uvd-codec.patch queue-3.14/drm-radeon-make-uvd-handle-checking-more-strict.patch queue-3.14/drm-radeon-disable-semaphores-for-uvd-v1-v2.patch