drm: Fix FD ownership check in drm_master_check_perm()
authorLingkai Dong <Lingkai.Dong@arm.com>
Wed, 6 Dec 2023 13:51:58 +0000 (13:51 +0000)
committerChristian König <christian.koenig@amd.com>
Thu, 7 Dec 2023 13:51:37 +0000 (14:51 +0100)
The DRM subsystem keeps a record of the owner of a DRM device file
descriptor using thread group ID (TGID) instead of process ID (PID), to
ensures all threads within the same userspace process are considered the
owner. However, the DRM master ownership check compares the current
thread's PID against the record, so the thread is incorrectly considered to
be not the FD owner if the PID is not equal to the TGID. This causes DRM
ioctls to be denied master privileges, even if the same thread that opened
the FD performs an ioctl. Fix this by checking TGID.

Fixes: 4230cea89cafb ("drm: Track clients by tgid and not tid")
Signed-off-by: Lingkai Dong <lingkai.dong@arm.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: <stable@vger.kernel.org> # v6.4+
Link: https://patchwork.freedesktop.org/patch/msgid/PA6PR08MB107665920BE9A96658CDA04CE8884A@PA6PR08MB10766.eurprd08.prod.outlook.com
Signed-off-by: Christian König <christian.koenig@amd.com>
drivers/gpu/drm/drm_auth.c

index 2ed2585ded3784882dd90260e070e27017a6d1f2..6899b3dc1f12a553c52043c2b73c985e72f627b9 100644 (file)
@@ -236,7 +236,7 @@ static int
 drm_master_check_perm(struct drm_device *dev, struct drm_file *file_priv)
 {
        if (file_priv->was_master &&
-           rcu_access_pointer(file_priv->pid) == task_pid(current))
+           rcu_access_pointer(file_priv->pid) == task_tgid(current))
                return 0;
 
        if (!capable(CAP_SYS_ADMIN))