{"id":25710,"date":"2026-09-18T04:31:46","date_gmt":"2026-09-17T20:31:46","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90301"},"modified":"2026-09-18T04:31:46","modified_gmt":"2026-09-17T20:31:46","slug":"cve-2026-90301","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90301","title":{"rendered":"CVE-2026-90301 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nocfs2: o2hb: quiesce"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ocfs2: o2hb: quiesce negotiate handlers and timeout work<\/p>\n<p>Heartbeat regions publish struct o2hb_region as the private data for the<br \/>\nNEGO_TIMEOUT and NEGO_APPROVE o2net handlers as soon as make_item()<br \/>\ncreates the configfs region.  The approve handler can call<br \/>\no2hb_arm_timeout(), so a peer can touch the region timeout work before<br \/>\ndev_store() has finished building the heartbeat runtime, or after teardown<br \/>\nhas started to shut that runtime back down.<\/p>\n<p>The final configfs put also has to keep reg alive until the last in-flight<br \/>\no2net callback drops its handler reference.<br \/>\no2net_unregister_handler_list() blocks future handler lookups, but it does<br \/>\nnot wait for sc_rx_work that already passed o2net_handler_get().  That<br \/>\ndrain needs to cover local listener teardown as well, where the o2net<br \/>\nordered workqueue may already be inside destroy_workqueue().<\/p>\n<p>Fix the lifetime rule in both directions.  Initialize the region delayed<br \/>\nworks before publishing reg through the o2net handler table, keep new or<br \/>\nstopping regions non-armable with hr_stopping, and quiesce both delayed<br \/>\nworks on failed-start and teardown paths even when no heartbeat thread is<br \/>\nleft to call o2hb_disarm_timeout().  Then unregister handlers before<br \/>\ntearing down handler-visible region state and make the drain wait for the<br \/>\nactive or destroying o2net ordered workqueue before release frees reg.<\/p>\n<p>The buggy scenario involves two paths, with each column showing the order<br \/>\nwithin that path:<\/p>\n<p>region lifecycle:                late negotiate callback:<br \/>\n1. make_item() registers the     1. o2net_process_message() gets a<br \/>\n   region handlers before           heartbeat handler for reg.<br \/>\n   dev_store() has built a       2. The callback runs after the lookup<br \/>\n   runnable heartbeat context.      lock is dropped and dereferences reg.<br \/>\n2. A failed start or rmdir       3. An approve or timeout path tries to<br \/>\n   stops the heartbeat thread,      queue reg&#8217;s delayed work, or release<br \/>\n   quiesces existing work, and      races the callback body after handler<br \/>\n   drops the final configfs ref.    unregister.<br \/>\n3. region_release() must drain   4. The callback or delayed work can<br \/>\n   handler-visible o2net rx work    outlive reg unless lifecycle code<br \/>\n   before freeing reg.              keeps the region non-armable and<br \/>\n                                    drains the active-or-destroying<br \/>\n                                    o2net workqueue.<\/p>\n<p>Validation reproduced this kernel report:<br \/>\nKASAN slab-use-after-free in __run_timers+0x22c\/0x5b0<br \/>\nWrite of size 8<br \/>\nCall trace:<br \/>\n  dump_stack_lvl+0x66\/0xa0<br \/>\n  print_report+0xce\/0x630<br \/>\n  __run_timers+0x22c\/0x5b0<br \/>\n  kasan_report+0xe0\/0x110<br \/>\n  _raw_spin_unlock_irqrestore+0x27\/0x60<br \/>\n  try_to_wake_up+0x191\/0xf70<br \/>\n  timer_expire_remote+0xae\/0xf0<br \/>\n  run_timer_softirq+0x19b\/0x1a0<br \/>\n  handle_softirqs+0x156\/0x660<br \/>\n  __irq_exit_rcu+0xc4\/0x160<br \/>\n  irq_exit_rcu+0xe\/0x20<br \/>\n  sysvec_apic_timer_interrupt+0x6c\/0x80<br \/>\n  asm_sysvec_apic_timer_interrupt+0x1a\/0x20<\/p>\n<p>Allocated by task stack:<br \/>\n  kasan_save_stack+0x33\/0x60<br \/>\n  kasan_save_track+0x14\/0x30<br \/>\n  __kasan_kmalloc+0xaa\/0xb0<br \/>\n  o2hb_heartbeat_group_make_item+0x3c\/0x600<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ocfs2: o2hb: quiesce negotiate handlers and timeout work<\/p>\n<p>Heartbeat regions publish struct o2hb_region as the private data for the<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25710","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25710","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=25710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}