Skip to content

Commit af0db3c

Browse files
SravanKumar247hdeller
authored andcommitted
fbdev: Fix vmalloc out-of-bounds write in fast_imageblit
This issue triggers when a userspace program does an ioctl FBIOPUT_CON2FBMAP by passing console number and frame buffer number. Ideally this maps console to frame buffer and updates the screen if console is visible. As part of mapping it has to do resize of console according to frame buffer info. if this resize fails and returns from vc_do_resize() and continues further. At this point console and new frame buffer are mapped and sets display vars. Despite failure still it continue to proceed updating the screen at later stages where vc_data is related to previous frame buffer and frame buffer info and display vars are mapped to new frame buffer and eventully leading to out-of-bounds write in fast_imageblit(). This bheviour is excepted only when fg_console is equal to requested console which is a visible console and updates screen with invalid struct references in fbcon_putcs(). Reported-and-tested-by: syzbot+c4b7aa0513823e2ea880@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=c4b7aa0513823e2ea880 Signed-off-by: Sravan Kumar Gundu <sravankumarlpu@gmail.com> Cc: stable@vger.kernel.org Signed-off-by: Helge Deller <deller@gmx.de>
1 parent 038d61f commit af0db3c

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

drivers/video/fbdev/core/fbcon.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,8 @@ static void con2fb_init_display(struct vc_data *vc, struct fb_info *info,
825825
fg_vc->vc_rows);
826826
}
827827

828-
update_screen(vc_cons[fg_console].d);
828+
if (fg_console != unit)
829+
update_screen(vc_cons[fg_console].d);
829830
}
830831

831832
/**
@@ -1362,6 +1363,7 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
13621363
struct vc_data *svc;
13631364
struct fbcon_ops *ops = info->fbcon_par;
13641365
int rows, cols;
1366+
unsigned long ret = 0;
13651367

13661368
p = &fb_display[unit];
13671369

@@ -1412,11 +1414,10 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
14121414
rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
14131415
cols /= vc->vc_font.width;
14141416
rows /= vc->vc_font.height;
1415-
vc_resize(vc, cols, rows);
1417+
ret = vc_resize(vc, cols, rows);
14161418

1417-
if (con_is_visible(vc)) {
1419+
if (con_is_visible(vc) && !ret)
14181420
update_screen(vc);
1419-
}
14201421
}
14211422

14221423
static __inline__ void ywrap_up(struct vc_data *vc, int count)

0 commit comments

Comments
 (0)