All of lore.kernel.org
 help / color / mirror / Atom feed
* [BUG] KASAN: vmalloc-out-of-bounds Read in imageblit
@ 2026-08-19 19:25 Jaeyoung Chung
  2026-08-19 19:42 ` sashiko-bot
  0 siblings, 1 reply; 2+ messages in thread
From: Jaeyoung Chung @ 2026-08-19 19:25 UTC (permalink / raw)
  To: deller, dri-devel, linux-fbdev, simona, soci
  Cc: linux-kernel, eulgyukim, jjy600901

Hello,

We found a "KASAN: vmalloc-out-of-bounds Read in imageblit" on Linux v7.2.
The issue was found by our own race fuzzer. We have not analyzed the root cause,
so we do not have a proposed fix to offer.

To reproduce the race reliably, we applied the delay patch below to the
kernel and ran the C reproducer as root inside an x86_64 QEMU guest. The
crash log we observed, the delay patch and the reproducer are all included
below.

The following kernel config options are required to reproduce the issue:
    CONFIG_VT=y
    CONFIG_VT_CONSOLE=y
    CONFIG_FB=y
    CONFIG_FB_CORE=y
    CONFIG_FRAMEBUFFER_CONSOLE=y
    CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
    CONFIG_FONT_SUPPORT=y
    CONFIG_FONT_8x16=y
    CONFIG_DRM=y
    CONFIG_DRM_BOCHS=y
    CONFIG_DRM_FBDEV_EMULATION=y
    CONFIG_KASAN=y
    CONFIG_KASAN_VMALLOC=y

We hope this report is useful. Please let us know if any further
information would help.

Reported-by: Eulgyu Kim <eulgyukim@snu.ac.kr>
Reported-by: Jaeyoung Chung <jjy600901@snu.ac.kr>

Kernel delay patch:
==================================================================
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 23b3c536d53d..774a38378aa5 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -84,6 +84,8 @@
 #include "fbcon.h"
 #include "fbcon_rotate.h"
 #include "fb_internal.h"
+#include <linux/sched.h>	/* syz_rg: current->comm for the comm gates */
+#include <linux/delay.h>	/* syz_rg: mdelay */
 
 /*
  * FIXME: Locking
@@ -1231,6 +1233,13 @@ static void fbcon_init(struct vc_data *vc, bool init)
 		set_blitting_type(vc, info);
 	}
 
+	if (strncmp(current->comm, "syzrepro0", 9) == 0) {
+		pr_info("syz_rg: fbcon_init arm vc=%u fg=%d par_rotate=%d fg_con_rotate=%d var=%ux%u\n",
+			vc->vc_num, fg_console, par->rotate,
+			fb_display[fg_console].con_rotate,
+			info->var.xres, info->var.yres);
+		mdelay(30);
+	}
 	par->p = &fb_display[fg_console];
 }
 
@@ -2432,6 +2441,13 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,
 		rows = FBCON_SWAP(par->rotate, info->var.yres, info->var.xres);
 		cols /= w;
 		rows /= h;
+		if (strncmp(current->comm, "syzrepro1", 9) == 0) {
+			pr_info("syz_rg: set_font rot=%d cols=%d rows=%d font=%dx%d var=%ux%u vc=%ux%u\n",
+				par->rotate, cols, rows, w, h,
+				info->var.xres, info->var.yres,
+				vc->vc_cols, vc->vc_rows);
+			mdelay(10);
+		}
 		ret = vc_resize(vc, cols, rows);
 		if (ret)
 			goto err_out;
diff --git a/drivers/video/fbdev/core/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c
index bde820967eb9..f93a4364f89c 100644
--- a/drivers/video/fbdev/core/fbcon_cw.c
+++ b/drivers/video/fbdev/core/fbcon_cw.c
@@ -15,6 +15,8 @@
 #include <linux/font.h>
 #include <linux/vt_kern.h>
 #include <linux/console.h>
+#include <linux/sched.h>	/* syz_rg: current->comm for the comm gates */
+#include <linux/delay.h>	/* syz_rg: mdelay */
 #include <asm/types.h>
 #include "fbcon.h"
 #include "fbcon_rotate.h"
@@ -137,6 +139,14 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
 	image.width = vc->vc_font.height;
 	image.depth = 1;
 
+	if (strncmp(current->comm, "syzrepro", 8) == 0 &&
+	    vc->vc_cols * vc->vc_font.width > info->var.yres) {
+		pr_info("syz_rg: cw_putcs pre-oob yy=%d xx=%d dx=%u dy=%u iw=%u cols=%u font=%ux%u yres=%u yvirt=%u vxres=%u\n",
+			yy, xx, image.dx, image.dy, image.width,
+			vc->vc_cols, vc->vc_font.width, vc->vc_font.height,
+			info->var.yres, info->var.yres_virtual, vxres);
+		mdelay(5);
+	}
 	if (attribute) {
 		buf = kmalloc(cellsize, GFP_KERNEL);
 		if (!buf)

==================================================================

C reproducer:
==================================================================
#define _GNU_SOURCE
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/prctl.h>
#include <unistd.h>

#define SYSCHK(x) ({ long __r = (long)(x); if (__r == -1L) { perror(#x); exit(1); } __r; })

#define FBIOGET_VSCREENINFO 0x4600
#define KDFONTOP            0x4B72
#define KD_FONT_OP_SET      0
#define VT_ACTIVATE         0x5606
#define VT_WAITACTIVE       0x5607
#define VT_DISALLOCATE      0x5608
#define VT_RESIZEX          0x560A

struct kfont_op {
	unsigned int op, flags, width, height, charcount;
	unsigned char *data;
};

struct vt_consize {
	unsigned short v_rows, v_cols, v_vlin, v_clin, v_vcol, v_ccol;
};

static const unsigned int heights[] = { 17, 19, 21, 23, 25, 27, 29, 31, 9, 11, 13, 15 };
static unsigned char font[8192];
static unsigned int xres = 1024, yres = 768;
static int tty0, fresh_vt = -1;
static volatile int phase, stop;

static void wait_phase(int want)
{
	while (phase != want && !stop)
		usleep(200);
}

static void *arm_thread(void *arg)
{
	char path[32];
	int round, fd, n;

	prctl(PR_SET_NAME, "syzrepro0", 0, 0, 0);
	for (round = 0; round < 120 && !stop; round++) {
		wait_phase(0);

		fd = open("/sys/class/graphics/fbcon/rotate", O_WRONLY);
		if (fd >= 0) {
			write(fd, "1\n", 2);
			close(fd);
		}

		n = 8 + (round % 50);
		snprintf(path, sizeof(path), "/dev/tty%d", n);
		fd = open(path, O_RDWR | O_NOCTTY);
		if (fd >= 0) {
			close(fd);
			fresh_vt = n;
		} else {
			fresh_vt = -1;
		}
		phase = 1;

		wait_phase(2);
		if (fresh_vt > 0)
			ioctl(tty0, VT_DISALLOCATE, (unsigned long)fresh_vt);
		fresh_vt = -1;
		phase = 0;
	}
	stop = 1;
	return NULL;
}

static void *trigger_thread(void *arg)
{
	unsigned int h;
	int round;

	prctl(PR_SET_NAME, "syzrepro1", 0, 0, 0);
	for (round = 0; round < 120 && !stop; round++) {
		h = heights[round % 12];
		wait_phase(1);

		if ((round % 4) == 3) {
			struct vt_consize cs;

			memset(&cs, 0, sizeof(cs));
			cs.v_cols = xres / 8;
			cs.v_rows = yres / h ? yres / h : 1;
			ioctl(tty0, VT_RESIZEX, &cs);
		} else {
			struct kfont_op op;

			memset(&op, 0, sizeof(op));
			op.op = KD_FONT_OP_SET;
			op.width = 8;
			op.height = h;
			op.charcount = 256;
			op.data = font;
			ioctl(tty0, KDFONTOP, &op);
		}
		phase = 2;
	}
	stop = 1;
	return NULL;
}

int main(void)
{
	unsigned int var[40];
	pthread_t t0, t1;
	int i, fd;

	for (i = 0; i < (int)sizeof(font); i++)
		font[i] = (unsigned char)(0x55 ^ i);

	fd = open("/dev/fb0", O_RDONLY);
	if (fd >= 0) {
		if (ioctl(fd, FBIOGET_VSCREENINFO, var) == 0) {
			xres = var[0];
			yres = var[1];
		}
		close(fd);
	}

	tty0 = SYSCHK(open("/dev/tty0", O_RDWR | O_NOCTTY));
	if (ioctl(tty0, VT_ACTIVATE, 1) == 0)
		ioctl(tty0, VT_WAITACTIVE, 1);

	pthread_create(&t0, NULL, arm_thread, NULL);
	pthread_create(&t1, NULL, trigger_thread, NULL);
	pthread_join(t0, NULL);
	pthread_join(t1, NULL);
	return 0;
}
==================================================================

Crash log:
==================================================================
BUG: KASAN: vmalloc-out-of-bounds in fb_read_offset drivers/video/fbdev/core/sysmem.h:38 [inline]
BUG: KASAN: vmalloc-out-of-bounds in fb_bitblit drivers/video/fbdev/core/fb_imageblit.h:137 [inline]
BUG: KASAN: vmalloc-out-of-bounds in fb_bitmap1x_imageblit drivers/video/fbdev/core/fb_imageblit.h:275 [inline]
BUG: KASAN: vmalloc-out-of-bounds in fb_bitmap_imageblit drivers/video/fbdev/core/fb_imageblit.h:477 [inline]
BUG: KASAN: vmalloc-out-of-bounds in fb_imageblit drivers/video/fbdev/core/fb_imageblit.h:492 [inline]
BUG: KASAN: vmalloc-out-of-bounds in sys_imageblit+0x10ab/0x1c50 drivers/video/fbdev/core/sysimgblt.c:24
Read of size 8 at addr ffffc90000a81fb8 by task syzrepro1/408

CPU: 2 UID: 0 PID: 408 Comm: syzrepro1 Not tainted 7.2.0-dirty #1 PREEMPT 
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
Call Trace:
 <TASK>
 dump_stack_lvl+0x5e/0x80 lib/dump_stack.c:120
 print_address_description+0x77/0x200 mm/kasan/report.c:378
 print_report+0x64/0x70 mm/kasan/report.c:482
 kasan_report+0x118/0x150 mm/kasan/report.c:595
 fb_read_offset drivers/video/fbdev/core/sysmem.h:38 [inline]
 fb_bitblit drivers/video/fbdev/core/fb_imageblit.h:137 [inline]
 fb_bitmap1x_imageblit drivers/video/fbdev/core/fb_imageblit.h:275 [inline]
 fb_bitmap_imageblit drivers/video/fbdev/core/fb_imageblit.h:477 [inline]
 fb_imageblit drivers/video/fbdev/core/fb_imageblit.h:492 [inline]
 sys_imageblit+0x10ab/0x1c50 drivers/video/fbdev/core/sysimgblt.c:24
 drm_fbdev_shmem_defio_imageblit+0x26/0x110 drivers/gpu/drm/drm_fbdev_shmem.c:39
 cw_putcs_aligned drivers/video/fbdev/core/fbcon_cw.c:113 [inline]
 cw_putcs+0x48c/0x1aa0 drivers/video/fbdev/core/fbcon_cw.c:169
 fbcon_putcs+0x616/0xa50 drivers/video/fbdev/core/fbcon.c:1401
 do_update_region+0x387/0x470 drivers/tty/vt/vt.c:656
 redraw_screen+0x652/0xcb0 drivers/tty/vt/vt.c:1008
 vc_do_resize+0xe4f/0x1490 drivers/tty/vt/vt.c:1309
 vc_resize include/linux/vt_kern.h:49 [inline]
 fbcon_do_set_font+0x693/0x1a90 drivers/video/fbdev/core/fbcon.c:2451
 fbcon_set_font+0x50c/0x750 drivers/video/fbdev/core/fbcon.c:2534
 con_font_set drivers/tty/vt/vt.c:4992 [inline]
 con_font_op+0x8a4/0xce0 drivers/tty/vt/vt.c:5032
 vt_k_ioctl drivers/tty/vt/vt_ioctl.c:474 [inline]
 vt_ioctl+0x719/0x1660 drivers/tty/vt/vt_ioctl.c:745
 tty_ioctl+0x89c/0xa40 drivers/tty/tty_io.c:2792
 vfs_ioctl fs/ioctl.c:51 [inline]
 __do_sys_ioctl fs/ioctl.c:597 [inline]
 __se_sys_ioctl+0xb6/0x100 fs/ioctl.c:583
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xf7/0x370 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x76/0x7e
RIP: 0033:0x79ef7f990d6b
Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 1c 48 8b 44 24 18 64 48 2b 04 25 28 00 00
RSP: 002b:000079ef7f08de10 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 000079ef7f990d6b
RDX: 000079ef7f08de70 RSI: 0000000000004b72 RDI: 0000000000000003
RBP: 0000000000000000 R08: 0000000000000000 R09: 00007ffe35b301e7
R10: 0000000000000000 R11: 0000000000000246 R12: 000079ef7f08de70
R13: 0000000000000011 R14: 0000583e9d2d80a0 R15: 0000583e9d2da060
 </TASK>

The buggy address belongs to a vmalloc virtual mapping
Memory state around the buggy address:
 ffffc90000a81e80: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
 ffffc90000a81f00: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
>ffffc90000a81f80: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
                                        ^
 ffffc90000a82000: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
 ffffc90000a82080: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
==================================================================
BUG: unable to handle page fault for address: ffffc90000a81fb8
#PF: supervisor read access in kernel mode
#PF: error_code(0x0000) - not-present page
PGD 100000067 P4D 100000067 PUD 1003ad067 PMD 102b57067 PTE 0
Oops: Oops: 0000 [#1] SMP KASAN PTI
CPU: 2 UID: 0 PID: 408 Comm: syzrepro1 Tainted: G    B               7.2.0-dirty #1 PREEMPT 
Tainted: [B]=BAD_PAGE
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
RIP: 0010:fb_read_offset drivers/video/fbdev/core/sysmem.h:38 [inline]
RIP: 0010:fb_bitblit drivers/video/fbdev/core/fb_imageblit.h:137 [inline]
RIP: 0010:fb_bitmap1x_imageblit drivers/video/fbdev/core/fb_imageblit.h:275 [inline]
RIP: 0010:fb_bitmap_imageblit drivers/video/fbdev/core/fb_imageblit.h:477 [inline]
RIP: 0010:fb_imageblit drivers/video/fbdev/core/fb_imageblit.h:492 [inline]
RIP: 0010:sys_imageblit+0x10d6/0x1c50 drivers/video/fbdev/core/sysimgblt.c:24
Code: 8b 54 24 38 4c 8b 4c 24 20 4c 8b 44 24 10 48 8b 7c 24 08 48 be 00 00 00 00 00 fc ff df 49 c7 c5 ff ff ff ff 44 89 c9 49 d3 e5 <48> 8b 0f 49 f7 d5 48 89 4c 24 50 49 21 cd eb 0c 45 31 ed 48 c7 44
RSP: 0018:ffffc900028ef5f0 EFLAGS: 00010287
RAX: ffff88810a328001 RBX: 0000000000000000 RCX: 0000000000000020
RDX: 0000000000000001 RSI: dffffc0000000000 RDI: ffffc90000a81fb8
RBP: ffffc900028ef6c8 R08: 0000000000000020 R09: 0000000000000020
R10: ffff888102858900 R11: fffffbfff54aabb9 R12: 0000000000000100
R13: ffffffff00000000 R14: 0000000000000000 R15: 0000000000000000
FS:  000079ef7f08e6c0(0000) GS:ffff888170830000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffc90000a81fb8 CR3: 0000000108fc6000 CR4: 00000000000006f0
Call Trace:
 <TASK>
 drm_fbdev_shmem_defio_imageblit+0x26/0x110 drivers/gpu/drm/drm_fbdev_shmem.c:39
 cw_putcs_aligned drivers/video/fbdev/core/fbcon_cw.c:113 [inline]
 cw_putcs+0x48c/0x1aa0 drivers/video/fbdev/core/fbcon_cw.c:169
 fbcon_putcs+0x616/0xa50 drivers/video/fbdev/core/fbcon.c:1401
 do_update_region+0x387/0x470 drivers/tty/vt/vt.c:656
 redraw_screen+0x652/0xcb0 drivers/tty/vt/vt.c:1008
 vc_do_resize+0xe4f/0x1490 drivers/tty/vt/vt.c:1309
 vc_resize include/linux/vt_kern.h:49 [inline]
 fbcon_do_set_font+0x693/0x1a90 drivers/video/fbdev/core/fbcon.c:2451
 fbcon_set_font+0x50c/0x750 drivers/video/fbdev/core/fbcon.c:2534
 con_font_set drivers/tty/vt/vt.c:4992 [inline]
 con_font_op+0x8a4/0xce0 drivers/tty/vt/vt.c:5032
 vt_k_ioctl drivers/tty/vt/vt_ioctl.c:474 [inline]
 vt_ioctl+0x719/0x1660 drivers/tty/vt/vt_ioctl.c:745
 tty_ioctl+0x89c/0xa40 drivers/tty/tty_io.c:2792
 vfs_ioctl fs/ioctl.c:51 [inline]
 __do_sys_ioctl fs/ioctl.c:597 [inline]
 __se_sys_ioctl+0xb6/0x100 fs/ioctl.c:583
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xf7/0x370 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x76/0x7e
RIP: 0033:0x79ef7f990d6b
Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 1c 48 8b 44 24 18 64 48 2b 04 25 28 00 00
RSP: 002b:000079ef7f08de10 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 000079ef7f990d6b
RDX: 000079ef7f08de70 RSI: 0000000000004b72 RDI: 0000000000000003
RBP: 0000000000000000 R08: 0000000000000000 R09: 00007ffe35b301e7
R10: 0000000000000000 R11: 0000000000000246 R12: 000079ef7f08de70
R13: 0000000000000011 R14: 0000583e9d2d80a0 R15: 0000583e9d2da060
 </TASK>
Modules linked in:
CR2: ffffc90000a81fb8
---[ end trace 0000000000000000 ]---
RIP: 0010:fb_read_offset drivers/video/fbdev/core/sysmem.h:38 [inline]
RIP: 0010:fb_bitblit drivers/video/fbdev/core/fb_imageblit.h:137 [inline]
RIP: 0010:fb_bitmap1x_imageblit drivers/video/fbdev/core/fb_imageblit.h:275 [inline]
RIP: 0010:fb_bitmap_imageblit drivers/video/fbdev/core/fb_imageblit.h:477 [inline]
RIP: 0010:fb_imageblit drivers/video/fbdev/core/fb_imageblit.h:492 [inline]
RIP: 0010:sys_imageblit+0x10d6/0x1c50 drivers/video/fbdev/core/sysimgblt.c:24
Code: 8b 54 24 38 4c 8b 4c 24 20 4c 8b 44 24 10 48 8b 7c 24 08 48 be 00 00 00 00 00 fc ff df 49 c7 c5 ff ff ff ff 44 89 c9 49 d3 e5 <48> 8b 0f 49 f7 d5 48 89 4c 24 50 49 21 cd eb 0c 45 31 ed 48 c7 44
RSP: 0018:ffffc900028ef5f0 EFLAGS: 00010287
RAX: ffff88810a328001 RBX: 0000000000000000 RCX: 0000000000000020
RDX: 0000000000000001 RSI: dffffc0000000000 RDI: ffffc90000a81fb8
RBP: ffffc900028ef6c8 R08: 0000000000000020 R09: 0000000000000020
R10: ffff888102858900 R11: fffffbfff54aabb9 R12: 0000000000000100
R13: ffffffff00000000 R14: 0000000000000000 R15: 0000000000000000
FS:  000079ef7f08e6c0(0000) GS:ffff888170830000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffc90000a81fb8 CR3: 0000000108fc6000 CR4: 00000000000006f0
----------------
Code disassembly (best guess):
   0:	8b 54 24 38          	mov    0x38(%rsp),%edx
   4:	4c 8b 4c 24 20       	mov    0x20(%rsp),%r9
   9:	4c 8b 44 24 10       	mov    0x10(%rsp),%r8
   e:	48 8b 7c 24 08       	mov    0x8(%rsp),%rdi
  13:	48 be 00 00 00 00 00 	movabs $0xdffffc0000000000,%rsi
  1a:	fc ff df
  1d:	49 c7 c5 ff ff ff ff 	mov    $0xffffffffffffffff,%r13
  24:	44 89 c9             	mov    %r9d,%ecx
  27:	49 d3 e5             	shl    %cl,%r13
* 2a:	48 8b 0f             	mov    (%rdi),%rcx <-- trapping instruction
  2d:	49 f7 d5             	not    %r13
  30:	48 89 4c 24 50       	mov    %rcx,0x50(%rsp)
  35:	49 21 cd             	and    %rcx,%r13
  38:	eb 0c                	jmp    0x46
  3a:	45 31 ed             	xor    %r13d,%r13d
  3d:	48                   	rex.W
  3e:	c7                   	.byte 0xc7
  3f:	44                   	rex.R
==================================================================



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [BUG] KASAN: vmalloc-out-of-bounds Read in imageblit
  2026-08-19 19:25 [BUG] KASAN: vmalloc-out-of-bounds Read in imageblit Jaeyoung Chung
@ 2026-08-19 19:42 ` sashiko-bot
  0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-08-19 19:42 UTC (permalink / raw)
  To: Jaeyoung Chung; +Cc: dri-devel

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

New issues:
- [High] The proposed patch consists entirely of artificial delays and hardcoded process name checks meant for a fuzzer reproducer. It introduces user-controllable `mdelay()` calls, which allows local users to trigger soft lockups and Denials of Service (DoS) under critical locks like the console lock.

Pre-existing issues:
- [High] Pre-existing vulnerability: A race condition exists between console initialization, font/geometry changes, and character rendering, leading to a KASAN vmalloc-out-of-bounds read in `imageblit`.
--

--- Patch [1]: [BUG] KASAN: vmalloc-out-of-bounds Read in imageblit ---
commit dcf37f3f2180abb3c3000d7b65ab0ea65910d9e2
Author: Jaeyoung Chung <jjy600901@snu.ac.kr>

KASAN: vmalloc-out-of-bounds Read in imageblit
    
This commit is a bug report for a vmalloc-out-of-bounds read in imageblit
found by a fuzzer. It includes a reproducer patch that adds artificial delays
and process name checks to reliably trigger the race condition.

> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
> index 23b3c536d53d1..774a38378aa5b 100644
> --- a/drivers/video/fbdev/core/fbcon.c
> +++ b/drivers/video/fbdev/core/fbcon.c
[ ... ]
> @@ -1231,6 +1233,13 @@ static void fbcon_init(struct vc_data *vc, bool init)
>  		set_blitting_type(vc, info);
>  	}
>  
> +	if (strncmp(current->comm, "syzrepro0", 9) == 0) {
> +		pr_info("syz_rg: fbcon_init arm vc=%u fg=%d par_rotate=%d fg_con_rotate=%d var=%ux%u\n",
> +			vc->vc_num, fg_console, par->rotate,
> +			fb_display[fg_console].con_rotate,
> +			info->var.xres, info->var.yres);
> +		mdelay(30);
> +	}

[Severity: High]
Is it intentional to include this diagnostic reproducer in the patch?
This introduces a 30ms busy-wait delay based on a user-controllable
process name during console initialization, which allows local users
to trigger soft lockups and Denials of Service under console locks.

>  	par->p = &fb_display[fg_console];

[Severity: High]
This is a pre-existing issue, but does this assignment alter the shared
console state in a way that can race with concurrent geometry computations?

Concurrent execution of fbcon_init(), fbcon_do_set_font(), and cw_putcs()
appears to cause shared state to become unsynchronized, leading to the
vmalloc-out-of-bounds read.

>  }
>  
> @@ -2432,6 +2441,13 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,
>  		rows = FBCON_SWAP(par->rotate, info->var.yres, info->var.xres);
>  		cols /= w;
>  		rows /= h;

[Severity: High]
This is a pre-existing issue, but can computing cols and rows using
potentially corrupted or racing par->rotate lead to oversized console
dimensions?

> +		if (strncmp(current->comm, "syzrepro1", 9) == 0) {
> +			pr_info("syz_rg: set_font rot=%d cols=%d rows=%d font=%dx%d var=%ux%u vc=%ux%u\n",
> +				par->rotate, cols, rows, w, h,
> +				info->var.xres, info->var.yres,
> +				vc->vc_cols, vc->vc_rows);
> +			mdelay(10);
> +		}

[Severity: High]
Does this code introduce a 10ms busy-wait delay in the font setting path
that could be exploited for a local Denial of Service?

>  		ret = vc_resize(vc, cols, rows);
>  		if (ret)
>  			goto err_out;
> diff --git a/drivers/video/fbdev/core/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c
> index bde820967eb9a..f93a4364f89c1 100644
> --- a/drivers/video/fbdev/core/fbcon_cw.c
> +++ b/drivers/video/fbdev/core/fbcon_cw.c
[ ... ]
> @@ -137,6 +139,14 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
>  	image.width = vc->vc_font.height;
>  	image.depth = 1;

[Severity: High]
This is a pre-existing issue, but does reading from vc->vc_font without
sufficient synchronization propagate out-of-bounds parameters to the blitter
when vc_cols * vc->vc_font.width > info->var.yres?

> +	if (strncmp(current->comm, "syzrepro", 8) == 0 &&
> +	    vc->vc_cols * vc->vc_font.width > info->var.yres) {
> +		pr_info("syz_rg: cw_putcs pre-oob yy=%d xx=%d dx=%u dy=%u iw=%u cols=%u font=%ux%u yres=%u yvirt=%u vxres=%u\n",
> +			yy, xx, image.dx, image.dy, image.width,
> +			vc->vc_cols, vc->vc_font.width, vc->vc_font.height,
> +			info->var.yres, info->var.yres_virtual, vxres);
> +		mdelay(5);
> +	}

[Severity: High]
Could this 5ms busy-wait delay in the character output path also be used
to trigger soft lockups by local users?

>  	if (attribute) {
>  		buf = kmalloc(cellsize, GFP_KERNEL);
>  		if (!buf)

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260819192516.57820-1-jjy600901@snu.ac.kr?part=1

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-08-19 19:42 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-19 19:25 [BUG] KASAN: vmalloc-out-of-bounds Read in imageblit Jaeyoung Chung
2026-08-19 19:42 ` sashiko-bot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.