{"id":5370,"date":"2026-09-04T18:47:47","date_gmt":"2026-09-04T10:47:47","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-68173"},"modified":"2026-09-04T18:47:47","modified_gmt":"2026-09-04T10:47:47","slug":"cve-2026-68173","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-68173","title":{"rendered":"CVE-2026-68173 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nublk: wait on ublk_de"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ublk: wait on ublk_dev_ready() instead of ub-&gt;completion<\/p>\n<p>ub-&gt;completion is only re-armed by a successful START_USER_RECOVERY. If<br \/>\nthe ublk server sends END_USER_RECOVERY without one &#8211; e.g. its START<br \/>\nfailed with -EBUSY and the error was ignored &#8211; the wait is satisfied by<br \/>\nthe stale completion of the previous recovery cycle, and the device is<br \/>\nmarked LIVE and the requeue list kicked while the FETCH stream is still<br \/>\nrunning and ubq-&gt;canceling is still set. The kick redispatches a<br \/>\npreviously requeued request, __ublk_queue_rq_common() sees -&gt;canceling<br \/>\nand parks it again via __ublk_abort_rq(), and after the last FETCH<br \/>\nclears -&gt;canceling nothing ever kicks the requeue list again: the<br \/>\nrequest is stranded there while holding its tag. If it is the flush<br \/>\nmachinery&#8217;s flush_rq, every subsequent fsync piles up in uninterruptible<br \/>\nsleep and teardown hangs on tag draining. This matches a report of a<br \/>\nlost PREFLUSH with ext4 on top of ublk after daemon crash recovery.<\/p>\n<p>ub-&gt;completion is an edge-triggered latch used as a proxy for the level<br \/>\ncondition &#8220;every queue has fetched all I\/O commands&#8221;, which can regress<br \/>\n(F_BATCH&#8217;s UNPREP, daemon death) and whose re-arm can be skipped. Drop<br \/>\nit and wait on the real condition instead: the new helper<br \/>\nublk_wait_dev_ready_and_lock() waits on ublk_dev_ready() via<br \/>\nwait_var_event_interruptible(), woken from ublk_mark_io_ready(), then<br \/>\nre-checks it under ub-&gt;mutex, waiting again on regression, and returns<br \/>\nwith the mutex held and readiness guaranteed.<\/p>\n<p>Readiness becomes true in the same ub-&gt;mutex critical section that<br \/>\nclears the last queue&#8217;s -&gt;canceling, so END_USER_RECOVERY marks the<br \/>\ndevice LIVE and kicks the requeue list strictly after -&gt;canceling<br \/>\nclears. The wait stays interruptible, so a server whose daemon died can<br \/>\nstill be signalled out. For ublk_ctrl_start_dev() this replaces the<br \/>\nfail-fast -EINVAL on an F_BATCH ready-&gt;UNPREP regression with waiting<br \/>\nuntil the device is ready again.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ublk: wait on ublk_dev_ready() instead of ub-&gt;completion<\/p>\n<p>ub-&gt;completion is only re-armed by a successful START_USER_RECOVERY. If<br \/>\nt<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-5370","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/5370","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=5370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}