{"id":15072,"date":"2026-09-04T19:02:24","date_gmt":"2026-09-04T11:02:24","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-64098"},"modified":"2026-09-04T19:02:24","modified_gmt":"2026-09-04T11:02:24","slug":"cve-2026-64098","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-64098","title":{"rendered":"CVE-2026-64098 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\ndrm\/virtio: use unint"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>drm\/virtio: use uninterruptible resv lock for plane updates<\/p>\n<p>virtio_gpu_cursor_plane_update() and virtio_gpu_resource_flush() lock<br \/>\nthe framebuffer BO&#8217;s dma_resv via virtio_gpu_array_lock_resv() and<br \/>\nignore its return value. The function can fail with -EINTR from<br \/>\ndma_resv_lock_interruptible() (signal during lock wait) or with<br \/>\n-ENOMEM from dma_resv_reserve_fences() (fence slot allocation),<br \/>\nleaving the resv lock not held. The queue path then walks the object<br \/>\narray and calls dma_resv_add_fence(), which requires the lock held;<br \/>\nwith lockdep enabled this trips dma_resv_assert_held():<\/p>\n<p>  WARNING: drivers\/dma-buf\/dma-resv.c:296 at dma_resv_add_fence+0x71e\/0x840<br \/>\n  Call Trace:<br \/>\n   virtio_gpu_array_add_fence<br \/>\n   virtio_gpu_queue_ctrl_sgs<br \/>\n   virtio_gpu_queue_fenced_ctrl_buffer<br \/>\n   virtio_gpu_cursor_plane_update<br \/>\n   drm_atomic_helper_commit_planes<br \/>\n   drm_atomic_helper_commit_tail<br \/>\n   commit_tail<br \/>\n   drm_atomic_helper_commit<br \/>\n   drm_atomic_commit<br \/>\n   drm_atomic_helper_update_plane<br \/>\n   __setplane_atomic<br \/>\n   drm_mode_cursor_universal<br \/>\n   drm_mode_cursor_common<br \/>\n   drm_mode_cursor_ioctl<br \/>\n   drm_ioctl<br \/>\n   __x64_sys_ioctl<\/p>\n<p>Beyond the WARN, mutating the dma_resv fence list without the lock<br \/>\nraces with concurrent readers\/writers and can corrupt the list.<\/p>\n<p>Both call sites run inside the .atomic_update plane callback, which<br \/>\nDRM atomic helpers do not allow to fail (by the time it runs, the<br \/>\ncommit has been signed off to userspace and there is no clean<br \/>\nrollback path). Moving the lock acquisition to .prepare_fb was<br \/>\nrejected because the broader lock scope deadlocks against other BO<br \/>\nlocking paths in the same atomic commit.<\/p>\n<p>Introduce virtio_gpu_lock_one_resv_uninterruptible() that uses<br \/>\ndma_resv_lock() instead of dma_resv_lock_interruptible(). This<br \/>\neliminates the -EINTR failure mode &#8212; the realistic syzbot trigger<br \/>\n&#8212; without extending the lock hold across the commit. The helper<br \/>\nlocks a single BO and rejects nents &gt; 1 with -EINVAL; both fix<br \/>\nsites lock exactly one BO.<\/p>\n<p>Use it from virtio_gpu_cursor_plane_update() and<br \/>\nvirtio_gpu_resource_flush(); check the return value to handle the<br \/>\nremaining -ENOMEM case from dma_resv_reserve_fences() by freeing<br \/>\nthe objs and skipping the plane update for that frame. The<br \/>\nframebuffer BOs touched here are not shared with other contexts<br \/>\nand lock contention is expected to be brief, so the loss of<br \/>\nsignal-interruptibility is acceptable.<\/p>\n<p>Other callers of virtio_gpu_array_lock_resv() (the ioctl paths)<br \/>\ncontinue to use the interruptible variant.<\/p>\n<p>The bug was reported by syzbot, triggered via fault injection<br \/>\n(fail_nth) on the DRM_IOCTL_MODE_CURSOR path, which forces the<br \/>\n-ENOMEM branch in dma_resv_reserve_fences().<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>drm\/virtio: use uninterruptible resv lock for plane updates<\/p>\n<p>virtio_gpu_cursor_plane_update() and virtio_gpu_resource_flush() lock<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-15072","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/15072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15072"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}