Skip to content

Commit b8509ce

Browse files
robclarkgregkh
authored andcommitted
drm/msm: protect against faults from copy_from_user() in submit ioctl
commit d78d383 upstream. An evil userspace could try to cause deadlock by passing an unfaulted-in GEM bo as submit->bos (or submit->cmds) table. Which will trigger msm_gem_fault() while we already hold struct_mutex. See: https://github.com/freedreno/msmtest/blob/master/evilsubmittest.c Signed-off-by: Rob Clark <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 399c967 commit b8509ce

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

drivers/gpu/drm/msm/msm_drv.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ struct msm_drm_private {
148148
} vram;
149149

150150
struct msm_vblank_ctrl vblank_ctrl;
151+
152+
/* task holding struct_mutex.. currently only used in submit path
153+
* to detect and reject faults from copy_from_user() for submit
154+
* ioctl.
155+
*/
156+
struct task_struct *struct_mutex_task;
151157
};
152158

153159
struct msm_format {

drivers/gpu/drm/msm/msm_gem.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,20 @@ int msm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
196196
{
197197
struct drm_gem_object *obj = vma->vm_private_data;
198198
struct drm_device *dev = obj->dev;
199+
struct msm_drm_private *priv = dev->dev_private;
199200
struct page **pages;
200201
unsigned long pfn;
201202
pgoff_t pgoff;
202203
int ret;
203204

205+
/* This should only happen if userspace tries to pass a mmap'd
206+
* but unfaulted gem bo vaddr into submit ioctl, triggering
207+
* a page fault while struct_mutex is already held. This is
208+
* not a valid use-case so just bail.
209+
*/
210+
if (priv->struct_mutex_task == current)
211+
return VM_FAULT_SIGBUS;
212+
204213
/* Make sure we don't parallel update on a fault, nor move or remove
205214
* something from beneath our feet
206215
*/

drivers/gpu/drm/msm/msm_gem_submit.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
394394
return -ENOMEM;
395395

396396
mutex_lock(&dev->struct_mutex);
397+
priv->struct_mutex_task = current;
397398

398399
ret = submit_lookup_objects(submit, args, file);
399400
if (ret)
@@ -479,6 +480,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
479480
submit_cleanup(submit);
480481
if (ret)
481482
msm_gem_submit_free(submit);
483+
priv->struct_mutex_task = NULL;
482484
mutex_unlock(&dev->struct_mutex);
483485
return ret;
484486
}

0 commit comments

Comments
 (0)