On Mon, Apr 17, 2023 at 1:45 PM Sui Jingfeng <suijingfeng@xxxxxxxxxxx> wrote: > The fbdev test of IGT may write after EOF, which lead to out-of-bound > access for the drm drivers using fbdev-generic. For example, on a x86 > + aspeed bmc card platform, with a 1680x1050 resolution display, running > fbdev test if IGT will cause the linux kernel hang with the following > call trace: > > Oops: 0000 [#1] PREEMPT SMP PTI > [IGT] fbdev: starting subtest eof > Workqueue: events drm_fb_helper_damage_work [drm_kms_helper] > [IGT] fbdev: starting subtest nullptr > > RIP: 0010:memcpy_erms+0xa/0x20 > RSP: 0018:ffffa17d40167d98 EFLAGS: 00010246 > RAX: ffffa17d4eb7fa80 RBX: ffffa17d40e0aa80 RCX: 00000000000014c0 > RDX: 0000000000001a40 RSI: ffffa17d40e0b000 RDI: ffffa17d4eb80000 > RBP: ffffa17d40167e20 R08: 0000000000000000 R09: ffff89522ecff8c0 > R10: ffffa17d4e4c5000 R11: 0000000000000000 R12: ffffa17d4eb7fa80 > R13: 0000000000001a40 R14: 000000000000041a R15: ffffa17d40167e30 > FS: 0000000000000000(0000) GS:ffff895257380000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: ffffa17d40e0b000 CR3: 00000001eaeca006 CR4: 00000000001706e0 > Call Trace: > <TASK> > ? drm_fbdev_generic_helper_fb_dirty+0x207/0x330 [drm_kms_helper] > drm_fb_helper_damage_work+0x8f/0x170 [drm_kms_helper] > process_one_work+0x21f/0x430 > worker_thread+0x4e/0x3c0 > ? __pfx_worker_thread+0x10/0x10 > kthread+0xf4/0x120 > ? __pfx_kthread+0x10/0x10 > ret_from_fork+0x2c/0x50 > </TASK> > CR2: ffffa17d40e0b000 > ---[ end trace 0000000000000000 ]--- > > The direct reason is that damage rectange computed by > drm_fb_helper_memory_range_to_clip() does not guaranteed to be in-bound. > It is already results in workaround code populate to elsewhere. Another > reason is that exposing a larger buffer size than the actual needed help > to trigger this bug intrinsic in drm_fb_helper_memory_range_to_clip(). > > Others fbdev emulation solutions write to the GEM buffer directly, they > won't reproduce this bug because the .fb_dirty function callback do not > being hooked, so no chance is given to drm_fb_helper_memory_range_to_clip() > to generate a out-of-bound when drm_fb_helper_sys_write() is called. > > This patch break the trigger condition of this bug by shrinking the shadow > buffer size to sizes->surface_height * buffer->fb->pitches[0]. > > Fixes: '8fbc9af55de0 ("drm/fbdev-generic: Set screen size to size of GEM > buffer")' > > Signed-off-by: Sui Jingfeng <suijingfeng@xxxxxxxxxxx> Thanks, this fixes the crashes when running fbtest on shmob-drm. Tested-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds