Linux Framebuffer Layer development
 help / color / mirror / Atom feed
* [PATCH] fbdev: udlfb: don't rebuild the mode list while the framebuffer is in use
@ 2026-09-12 21:15 Xiang Mei
  2026-09-12 21:49 ` Helge Deller
  0 siblings, 1 reply; 2+ messages in thread
From: Xiang Mei @ 2026-09-12 21:15 UTC (permalink / raw)
  To: bernie, deller, linux-fbdev, dri-devel
  Cc: gregkh, co+ed9902f2e44184d9, Xiang Mei, stable

dlfb_setup_modes() frees info->modelist with fb_destroy_modelist() and
rebuilds it, but fbcon holds raw pointers into that list in
fb_display[i].mode and nothing un-publishes them the way
do_unregister_framebuffer() and store_modes() do with
fbcon_delete_modelist(). The function does refuse to install a new mode
while the framebuffer has users (dlfb->fb_count != 0), but only after the
list is already destroyed. Reached from the 0666 "edid" sysfs attribute,
an unprivileged write to /sys/class/graphics/fb0/edid therefore fails with
-EINVAL and still leaves every fb_display[i].mode dangling; the next
console switch reads the freed fb_videomode in fb_videomode_to_var().

Test fb_count before touching the list. fbcon takes a reference through
fbcon_open(), so that condition covers exactly the states in which
fb_display[] points into the list, and the errno returned to userspace is
unchanged.

  BUG: KASAN: slab-use-after-free in fb_videomode_to_var (drivers/video/fbdev/core/modedb.c:905)
  Read of size 4 at addr ffff8880107b449c by task kworker/1:1/47
  Workqueue: events console_callback
  Call Trace:
   fb_videomode_to_var (drivers/video/fbdev/core/modedb.c:905)
   display_to_var (drivers/video/fbdev/core/fbcon.c:998)
   fbcon_switch (drivers/video/fbdev/core/fbcon.c:2182)
   redraw_screen (drivers/tty/vt/vt.c:994)
   complete_change_console (drivers/tty/vt/vt_ioctl.c:1141)
   console_callback (drivers/tty/vt/vt.c:3358)
   process_one_work (kernel/workqueue.c:3396)
   worker_thread (kernel/workqueue.c:3479 kernel/workqueue.c:3560)
   kthread (kernel/kthread.c:436)
   ret_from_fork (arch/x86/kernel/process.c:158)
   ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
  ...
  The buggy address is located 28 bytes inside of
   freed 96-byte region [ffff8880107b4480, ffff8880107b44e0)

Cc: stable@vger.kernel.org
Fixes: 7d9485e2c53c ("Staging: udlfb: Add functions to expose sysfs metrics and controls")
Reported-by: co+ed9902f2e44184d9@bugs.sh
Closes: https://lore.kernel.org/all/1jSCSNaDKmuUG7h40rTsSl1rMaSwdlJef4rp%40bugs.sh/
Assisted-by: Claude:claude-opus-5
Signed-off-by: Xiang Mei <xmei5@asu.edu>
---
 drivers/video/fbdev/udlfb.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c
index e78d6f95c9c5..92b352bc7e96 100644
--- a/drivers/video/fbdev/udlfb.c
+++ b/drivers/video/fbdev/udlfb.c
@@ -1293,6 +1293,11 @@ static int dlfb_setup_modes(struct dlfb_data *dlfb,
 		goto error;
 	}
 
+	if (dlfb->fb_count) {
+		result = -EINVAL;
+		goto error;
+	}
+
 	fb_destroy_modelist(&info->modelist);
 	memset(&info->monspecs, 0, sizeof(info->monspecs));
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] fbdev: udlfb: don't rebuild the mode list while the framebuffer is in use
  2026-09-12 21:15 [PATCH] fbdev: udlfb: don't rebuild the mode list while the framebuffer is in use Xiang Mei
@ 2026-09-12 21:49 ` Helge Deller
  0 siblings, 0 replies; 2+ messages in thread
From: Helge Deller @ 2026-09-12 21:49 UTC (permalink / raw)
  To: Xiang Mei, bernie, linux-fbdev, dri-devel; +Cc: gregkh, co+ed9902f2e44184d9

On 9/12/26 23:15, Xiang Mei wrote:
> dlfb_setup_modes() frees info->modelist with fb_destroy_modelist() and
> rebuilds it, but fbcon holds raw pointers into that list in
> fb_display[i].mode and nothing un-publishes them the way
> do_unregister_framebuffer() and store_modes() do with
> fbcon_delete_modelist(). The function does refuse to install a new mode
> while the framebuffer has users (dlfb->fb_count != 0), but only after the
> list is already destroyed. Reached from the 0666 "edid" sysfs attribute,
> an unprivileged write to /sys/class/graphics/fb0/edid therefore fails with
> -EINVAL and still leaves every fb_display[i].mode dangling; the next
> console switch reads the freed fb_videomode in fb_videomode_to_var().
> 
> Test fb_count before touching the list. fbcon takes a reference through
> fbcon_open(), so that condition covers exactly the states in which
> fb_display[] points into the list, and the errno returned to userspace is
> unchanged.
> 
>    BUG: KASAN: slab-use-after-free in fb_videomode_to_var (drivers/video/fbdev/core/modedb.c:905)
>    Read of size 4 at addr ffff8880107b449c by task kworker/1:1/47
>    Workqueue: events console_callback
>    Call Trace:
>     fb_videomode_to_var (drivers/video/fbdev/core/modedb.c:905)
>     display_to_var (drivers/video/fbdev/core/fbcon.c:998)
>     fbcon_switch (drivers/video/fbdev/core/fbcon.c:2182)
>     redraw_screen (drivers/tty/vt/vt.c:994)
>     complete_change_console (drivers/tty/vt/vt_ioctl.c:1141)
>     console_callback (drivers/tty/vt/vt.c:3358)
>     process_one_work (kernel/workqueue.c:3396)
>     worker_thread (kernel/workqueue.c:3479 kernel/workqueue.c:3560)
>     kthread (kernel/kthread.c:436)
>     ret_from_fork (arch/x86/kernel/process.c:158)
>     ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
>    ...
>    The buggy address is located 28 bytes inside of
>     freed 96-byte region [ffff8880107b4480, ffff8880107b44e0)
> 
> Cc: stable@vger.kernel.org
> Fixes: 7d9485e2c53c ("Staging: udlfb: Add functions to expose sysfs metrics and controls")
> Reported-by: co+ed9902f2e44184d9@bugs.sh
> Closes: https://lore.kernel.org/all/1jSCSNaDKmuUG7h40rTsSl1rMaSwdlJef4rp%40bugs.sh/
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Xiang Mei <xmei5@asu.edu>
> ---
>   drivers/video/fbdev/udlfb.c | 5 +++++
>   1 file changed, 5 insertions(+)

Looks good.
Applied.

Thanks!
Helge

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-09-12 21:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-12 21:15 [PATCH] fbdev: udlfb: don't rebuild the mode list while the framebuffer is in use Xiang Mei
2026-09-12 21:49 ` Helge Deller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox