summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuo Li <islituo@gmail.com>2026-06-10 10:50:14 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-07-04 13:44:20 +0200
commit4d418cf8daf57e454b4d855bf9b2419fd8e6a540 (patch)
treef857b4d3ac665ed13c5770edbf3190a5e3091e21
parenteea16b6f805c0b1fb2f72f0f771088ea45356956 (diff)
downloadlinux-4d418cf8daf57e454b4d855bf9b2419fd8e6a540.tar.gz
linux-4d418cf8daf57e454b4d855bf9b2419fd8e6a540.zip
fbdev: modedb: fix a possible UAF in fb_find_mode()
commit 85b6256469cebdac395e7447147e06b2e151014f upstream. If mode_option is NULL, it is assigned from mode_option_buf: if (!mode_option) { fb_get_options(NULL, &mode_option_buf); mode_option = mode_option_buf; } Later, name is assigned from mode_option: const char *name = mode_option; However, mode_option_buf is freed before name is no longer used: kfree(mode_option_buf); while name is still accessed by: if ((name_matches(db[i], name, namelen) || Since name aliases mode_option_buf, this may result in a use-after-free. Fix this by extending the lifetime of mode_option_buf until the end of the function by using scope-based resource management for cleanup. Signed-off-by: Tuo Li <islituo@gmail.com> Cc: stable@vger.kernel.org # v6.5+ Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/video/fbdev/core/modedb.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/video/fbdev/core/modedb.c b/drivers/video/fbdev/core/modedb.c
index 53a610948c4a..25e8a83c571e 100644
--- a/drivers/video/fbdev/core/modedb.c
+++ b/drivers/video/fbdev/core/modedb.c
@@ -626,7 +626,7 @@ int fb_find_mode(struct fb_var_screeninfo *var,
const struct fb_videomode *default_mode,
unsigned int default_bpp)
{
- char *mode_option_buf = NULL;
+ char *mode_option_buf __free(kfree) = NULL;
int i;
/* Set up defaults */
@@ -724,7 +724,6 @@ int fb_find_mode(struct fb_var_screeninfo *var,
res_specified = 1;
}
done:
- kfree(mode_option_buf);
if (cvt) {
struct fb_videomode cvt_mode;
int ret;