patch "fbcon: prevent user font height or width change from causing" added to tty-linus
Subsystems (4)
This is a note to let you know that I've just added the patch titled
fbcon: prevent user font height or width change from causing
to my tty git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
in the tty-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 39b3cffb8cf3111738ea993e2757ab382253d86a Mon Sep 17 00:00:00 2001
From: George Kennedy <[email protected]>
Date: Fri, 31 Jul 2020 12:33:11 -0400
Subject: fbcon: prevent user font height or width change from causing
potential out-of-bounds access
Add a check to fbcon_resize() to ensure that a possible change to user font height or user font width will not allow a font data out-of-bounds access.
NOTE: must use original charcount in calculation as font charcount can change and cannot be used to determine the font data allocated size.
--- drivers/video/fbdev/core/fbcon.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/video/fbdev/core/fbcon.c +23 -2
@@ -2191,6 +2191,9 @@ static void updatescrollmode(struct fbcon_display *p, } } +#define PITCH (w) (((w) + 7) >> 3) +#define CALC_FONTSZ (h, p, c) ((h) * (p) * (c))/* size = height * pitch * charcount */ +static int fbcon_resize (struct vc_data *vc,unsigned int width,unsigned int height,unsigned int user) {
@@ -2200,6 +2203,24 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,struct fb_var_screeninfo var = info->var;int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh; +if (ops->p && ops->p->userfont &&FNTSIZE (vc->vc_font.data)) { +int size; +int pitch =PITCH (vc->vc_font.width); + +/* +* If user font, ensure that a possible change to user font +* height or width will not allow a font data out-of-bounds access. +* NOTE: must use original charcount in calculation as font +* charcount can change and cannot be used to determine the +* font data allocated size. +*/ +if (pitch <=0 ) +return -EINVAL ; + size =CALC_FONTSZ (vc->vc_font.height, pitch,FNTCHARCNT (vc->vc_font.data)); +if (size >FNTSIZE (vc->vc_font.data)) +return -EINVAL ; + } + virt_w =FBCON_SWAP (ops->rotate, width, height); virt_h =FBCON_SWAP (ops->rotate, height, width); virt_fw = FBCON_SWAP(ops->rotate, vc->vc_font.width,
@@ -2652,7 +2673,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,int size;int i, csum;u8 *new_data, *data = font->data; -int pitch = (font->width+7 ) >>3 ; +int pitch =PITCH (font->width);/* Is there a reason why fbconsole couldn't handle any charcount >256? * If not this check should be changed to charcount < 256 */
@@ -2668,7 +2689,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,if (fbcon_invalid_charcount (info, charcount))return -EINVAL ; - size = h * pitch * charcount; + size =CALC_FONTSZ (h, pitch, charcount); new_data =kmalloc (FONT_EXTRA_WORDS *sizeof (int ) + size,GFP_USER );
Signature · 1 line
2.28.0