FAILED: patch "[PATCH] drm/virtio: Fix GEM handle creation UAF" failed to apply to 4.19-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
52531258318e ("drm/virtio: Fix GEM handle creation UAF")897b4d1acaf5 ("drm/virtio: implement blob resources: resource create blob ioctl")16845c5d5409 ("drm/virtio: implement blob resources: implement vram object")6076a9711dc5 ("drm/virtio: implement blob resources: probe for host visible region") 6815cfe602d0 ("drm/virtio: implement blob resources: probe for the feature.")30172efbfb84 ("drm/virtio: blob prep: refactor getting pages and attaching backing") deb2464e4c6d ("drm/virtio: report uuid in debugfs")c84adb304c10 ("drm/virtio: Support virtgpu exported resources")0a19b068acc4 ("Merge tag 'drm-misc-next-2020-06-19' of git://anongit.freedesktop.org/drm/drm-misc into drm-next")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 52531258318ed59a2dc5a43df2eaf0eb1d65438e Mon Sep 17 00:00:00 2001
From: Rob Clark <[email protected]>
Date: Fri, 16 Dec 2022 15:33:55 -0800
Subject: [PATCH] drm/virtio: Fix GEM handle creation UAF
Userspace can guess the handle value and try to race GEM object creation with handle close, resulting in a use-after-free if we dereference the object after dropping the handle's reference. For that reason, dropping the handle's reference must be done *after* we are done dereferencing the object.
drivers/gpu/drm/virtio/virtgpu_ioctl.c +17 -2
@@ -358,10 +358,18 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,drm_gem_object_release (obj);return ret; } -drm_gem_object_put (obj); rc->res_handle = qobj->hw_res_handle;/* similiar to a VM address */ rc->bo_handle = handle; + +/* +* The handle owns the reference now. But we must drop our +* remaining reference *after* we no longer need to dereference +* the obj. Otherwise userspace could guess the handle and +* race closing it from another thread. +*/ +drm_gem_object_put (obj); +return 0 ; }
@@ -723,11 +731,18 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev,drm_gem_object_release (obj);return ret; } -drm_gem_object_put (obj); rc_blob->res_handle = bo->hw_res_handle; rc_blob->bo_handle = handle; +/* +* The handle owns the reference now. But we must drop our +* remaining reference *after* we no longer need to dereference +* the obj. Otherwise userspace could guess the handle and +* race closing it from another thread. +*/ +drm_gem_object_put (obj); +return 0 ; }