Patch "drm/scheduler: set entity to NULL in drm_sched_entity_pop_job()" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/scheduler: set entity to NULL in drm_sched_entity_pop_job()

to the 6.4-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-scheduler-set-entity-to-null-in-drm_sched_entity.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6bd22f112f8bf0974ff616f6f14c13179d9117d7
Author: Danilo Krummrich <dakr@xxxxxxxxxx>
Date:   Tue Apr 18 12:04:53 2023 +0200

    drm/scheduler: set entity to NULL in drm_sched_entity_pop_job()
    
    [ Upstream commit 96c7c2f4d5bd94b15fe63448c087f01607b56f4a ]
    
    It already happend a few times that patches slipped through which
    implemented access to an entity through a job that was already removed
    from the entities queue. Since jobs and entities might have different
    lifecycles, this can potentially cause UAF bugs.
    
    In order to make it obvious that a jobs entity pointer shouldn't be
    accessed after drm_sched_entity_pop_job() was called successfully, set
    the jobs entity pointer to NULL once the job is removed from the entity
    queue.
    
    Moreover, debugging a potential NULL pointer dereference is way easier
    than potentially corrupted memory through a UAF.
    
    Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230418100453.4433-1-dakr@xxxxxxxxxx
    Reviewed-by: Luben Tuikov <luben.tuikov@xxxxxxx>
    Signed-off-by: Luben Tuikov <luben.tuikov@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c
index e0a8890a62e23..3e2a31d8190eb 100644
--- a/drivers/gpu/drm/scheduler/sched_entity.c
+++ b/drivers/gpu/drm/scheduler/sched_entity.c
@@ -448,6 +448,12 @@ struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity)
 			drm_sched_rq_update_fifo(entity, next->submit_ts);
 	}
 
+	/* Jobs and entities might have different lifecycles. Since we're
+	 * removing the job from the entities queue, set the jobs entity pointer
+	 * to NULL to prevent any future access of the entity through this job.
+	 */
+	sched_job->entity = NULL;
+
 	return sched_job;
 }
 
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index aea5a90ff98b9..cdd67676c3d1b 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -42,6 +42,10 @@
  *    the hardware.
  *
  * The jobs in a entity are always scheduled in the order that they were pushed.
+ *
+ * Note that once a job was taken from the entities queue and pushed to the
+ * hardware, i.e. the pending queue, the entity must not be referenced anymore
+ * through the jobs entity pointer.
  */
 
 #include <linux/kthread.h>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux