linux/drivers/video/fbdev
Thomas Zimmermann eb76d0f555 drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup
Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB
access in fbcon_remap_all(). Without holding the console lock the call
races with switching outputs.

VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon
function uses struct fb_info.node, which is set by register_framebuffer().
As the fb-helper code currently sets up VGA switcheroo before registering
the framebuffer, the value of node is -1 and therefore not a legal value.
For example, fbcon uses the value within set_con2fb_map() [1] as an index
into an array.

Moving vga_switcheroo_client_fb_set() after register_framebuffer() can
result in VGA switching that does not switch fbcon correctly.

Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(),
which already holds the console lock. Fbdev calls fbcon_fb_registered()
from within register_framebuffer(). Serializes the helper with VGA
switcheroo's call to fbcon_remap_all().

Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info
as parameter, it really only needs the contained fbcon state. Moving the
call to fbcon initialization is therefore cleaner than before. Only amdgpu,
i915, nouveau and radeon support vga_switcheroo. For all other drivers,
this change does nothing.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1]
Fixes: 6a9ee8af34 ("vga_switcheroo: initial implementation (v15)")
Acked-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Cc: dri-devel@lists.freedesktop.org
Cc: nouveau@lists.freedesktop.org
Cc: amd-gfx@lists.freedesktop.org
Cc: linux-fbdev@vger.kernel.org
Cc: <stable@vger.kernel.org> # v2.6.34+
Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de
2025-11-25 09:08:32 +01:00
..
aty fbdev: atyfb: Check if pll_ops->init_pll failed 2025-10-28 22:59:19 +01:00
core drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup 2025-11-25 09:08:32 +01:00
geode
i810
kyro fbdev: kyro: Use devm_ioremap_wc() for screen mem 2025-07-27 19:56:51 +02:00
matrox fbdev/matroxfb: Include <linux/export.h> 2025-06-16 09:07:08 +02:00
mb862xx fbdev: mb862xxfb: Use int type to store negative error codes 2025-09-30 23:21:34 +02:00
mmp
nvidia fbdev: Use string choices helpers 2025-09-30 23:21:34 +02:00
omap fbdev/omap: Include <linux/export.h> 2025-06-16 09:07:12 +02:00
omap2 fbdev/omap2: Do not include <linux/export.h> 2025-06-16 09:07:47 +02:00
riva
savage
sis fbdev/sisfb: Unexport symbols 2025-06-16 09:08:06 +02:00
via treewide: rename GPIO set callbacks back to their original names 2025-08-07 10:07:06 +02:00
68328fb.c
Kconfig fbdev fixes & enhancements for 6.18-rc1: 2025-10-10 09:36:23 -07:00
Makefile
acornfb.c
acornfb.h
amifb.c
arcfb.c
arkfb.c fbdev: arkfb: Cast ics5342_init() allocation type 2025-05-31 10:24:02 +02:00
asiliantfb.c
atafb.c
atafb.h
atafb_iplan2p2.c
atafb_iplan2p4.c
atafb_iplan2p8.c
atafb_mfb.c
atafb_utils.h
atmel_lcdfb.c
au1100fb.c
au1100fb.h
au1200fb.c
au1200fb.h
broadsheetfb.c
bt431.h
bt455.h
bw2.c
c2p.h
c2p_core.h
c2p_iplan2.c fbdev/c2p: Include <linux/export.h> 2025-06-16 09:06:58 +02:00
c2p_planar.c fbdev/c2p: Include <linux/export.h> 2025-06-16 09:06:58 +02:00
carminefb.c
carminefb.h
carminefb_regs.h
cg3.c
cg6.c
cg14.c
chipsfb.c
cirrusfb.c
clps711x-fb.c
cobalt_lcdfb.c
controlfb.c
controlfb.h
cyber2000fb.c fbdev/cyber2000fb: Unexport symbols 2025-06-16 09:07:03 +02:00
cyber2000fb.h fbdev/cyber2000fb: Unexport symbols 2025-06-16 09:07:03 +02:00
dnfb.c
edid.h
efifb.c
ep93xx-fb.c
ffb.c
fm2fb.c
fsl-diu-fb.c
g364fb.c
gbefb.c
goldfishfb.c
grvga.c
gxt4500.c
hecubafb.c
hgafb.c
hitfb.c
hpfb.c
hyperv_fb.c fbdev/hyperv_fb: deprecate this in favor of Hyper-V DRM driver 2025-10-02 21:15:29 +00:00
i740_reg.h
i740fb.c
imsttfb.c
imxfb.c fbdev: imxfb: Check fb_add_videomode to prevent null-ptr-deref 2025-07-27 19:56:51 +02:00
leo.c
macfb.c
macmodes.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
macmodes.h
maxinefb.c
metronomefb.c
n411.c
neofb.c
ocfb.c
offb.c
p9100.c
platinumfb.c
platinumfb.h
pm2fb.c
pm3fb.c
pmag-aa-fb.c
pmag-ba-fb.c
pmagb-b-fb.c
ps3fb.c
pvr2fb.c fbdev: pvr2fb: Fix leftover reference to ONCHIP_NR_DMA_CHANNELS 2025-10-28 22:59:19 +01:00
pxa3xx-gcu.c
pxa3xx-gcu.h
pxa3xx-regs.h
pxa168fb.c
pxa168fb.h
pxafb.c fbdev: Use string choices helpers 2025-09-30 23:21:34 +02:00
pxafb.h
q40fb.c
s1d13xxxfb.c
s3c-fb.c
s3fb.c fbdev: s3fb: Revert mclk stop in suspend 2025-09-30 23:21:34 +02:00
sa1100fb.c
sa1100fb.h
sbuslib.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
sbuslib.h
sh7760fb.c
sh_mobile_lcdcfb.c
sh_mobile_lcdcfb.h
simplefb.c fbdev: simplefb: Fix use after free in simplefb_detach_genpds() 2025-09-30 23:21:34 +02:00
skeletonfb.c
sm501fb.c
sm712.h
sm712fb.c
smscufx.c
ssd1307fb.c
sstfb.c
stifb.c
sunxvr500.c
sunxvr1000.c
sunxvr2500.c
tcx.c
tdfxfb.c
tgafb.c
tridentfb.c
udlfb.c sysfs: treewide: switch back to bin_attribute::read()/write() 2025-06-17 10:44:13 +02:00
uvesafb.c
valkyriefb.c fbdev: valkyriefb: Fix reference count leak in valkyriefb_init 2025-10-28 22:59:19 +01:00
valkyriefb.h
vesafb.c
vfb.c
vga16fb.c
vt8500lcdfb.c
vt8500lcdfb.h
vt8623fb.c
wm8505fb.c
wm8505fb_regs.h
wmt_ge_rops.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
wmt_ge_rops.h
xen-fbfront.c fbdev: xenfb: Use vmalloc_array to simplify code 2025-09-30 23:21:34 +02:00
xilinxfb.c