drm/fdinfo: Protect against driver unbind
authorTvrtko Ursulin <tvrtko.ursulin@igalia.com>
Fri, 18 Apr 2025 16:25:12 +0000 (17:25 +0100)
committerChristian König <christian.koenig@amd.com>
Mon, 28 Apr 2025 18:04:15 +0000 (20:04 +0200)
If we unbind a driver from the PCI device with an active DRM client,
subsequent read of the fdinfo data associated with the file descriptor in
question will not end well.

Protect the path with a drm_dev_enter/exit() pair.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Fixes: 3f09a0cd4ea3 ("drm: Add common fdinfo helper")
Cc: <stable@vger.kernel.org> # v6.5+
Signed-off-by: Christian König <christian.koenig@amd.com>
Link: https://lore.kernel.org/r/20250418162512.72324-1-tvrtko.ursulin@igalia.com
drivers/gpu/drm/drm_file.c

index c299cd94d3f78fec2ac0dbb3d8241569640806d8..cf2463090d3acc7a9823749d68a414698300c059 100644 (file)
@@ -964,6 +964,10 @@ void drm_show_fdinfo(struct seq_file *m, struct file *f)
        struct drm_file *file = f->private_data;
        struct drm_device *dev = file->minor->dev;
        struct drm_printer p = drm_seq_file_printer(m);
+       int idx;
+
+       if (!drm_dev_enter(dev, &idx))
+               return;
 
        drm_printf(&p, "drm-driver:\t%s\n", dev->driver->name);
        drm_printf(&p, "drm-client-id:\t%llu\n", file->client_id);
@@ -983,6 +987,8 @@ void drm_show_fdinfo(struct seq_file *m, struct file *f)
 
        if (dev->driver->show_fdinfo)
                dev->driver->show_fdinfo(&p, file);
+
+       drm_dev_exit(idx);
 }
 EXPORT_SYMBOL(drm_show_fdinfo);