提交 05c9593f 编写于 作者: Z Zheyu Ma 提交者: Zheng Zengkai

video: fbdev: s3fb: Check the size of screen before memset_io()

stable inclusion
from stable-v5.10.137
commit 5e0da18956d38e7106664dc1d06367b22f06edd3
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I60PLB

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=5e0da18956d38e7106664dc1d06367b22f06edd3

--------------------------------

[ Upstream commit 6ba592fa ]

In the function s3fb_set_par(), the value of 'screen_size' is
calculated by the user input. If the user provides the improper value,
the value of 'screen_size' may larger than 'info->screen_size', which
may cause the following bug:

[   54.083733] BUG: unable to handle page fault for address: ffffc90003000000
[   54.083742] #PF: supervisor write access in kernel mode
[   54.083744] #PF: error_code(0x0002) - not-present page
[   54.083760] RIP: 0010:memset_orig+0x33/0xb0
[   54.083782] Call Trace:
[   54.083788]  s3fb_set_par+0x1ec6/0x4040
[   54.083806]  fb_set_var+0x604/0xeb0
[   54.083836]  do_fb_ioctl+0x234/0x670

Fix the this by checking the value of 'screen_size' before memset_io().

Fixes: a268422d ("fbdev driver for S3 Trio/Virge")
Signed-off-by: NZheyu Ma <zheyuma97@gmail.com>
Signed-off-by: NHelge Deller <deller@gmx.de>
Signed-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Reviewed-by: NWei Li <liwei391@huawei.com>
上级 8c99cf9d
...@@ -902,6 +902,8 @@ static int s3fb_set_par(struct fb_info *info) ...@@ -902,6 +902,8 @@ static int s3fb_set_par(struct fb_info *info)
value = clamp((htotal + hsstart + 1) / 2 + 2, hsstart + 4, htotal + 1); value = clamp((htotal + hsstart + 1) / 2 + 2, hsstart + 4, htotal + 1);
svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value); svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value);
if (screen_size > info->screen_size)
screen_size = info->screen_size;
memset_io(info->screen_base, 0x00, screen_size); memset_io(info->screen_base, 0x00, screen_size);
/* Device and screen back on */ /* Device and screen back on */
svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册