{"id":25711,"date":"2026-09-18T04:31:46","date_gmt":"2026-09-17T20:31:46","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90302"},"modified":"2026-09-18T04:31:46","modified_gmt":"2026-09-17T20:31:46","slug":"cve-2026-90302","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90302","title":{"rendered":"CVE-2026-90302 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nocfs2: synchronize he"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ocfs2: synchronize heartbeat callbacks with o2net teardown<\/p>\n<p>Patch series &#8220;ocfs2: harden heartbeat teardown races&#8221;.<\/p>\n<p>This series fixes two OCFS2 heartbeat\/o2net teardown races found by<br \/>\nKASAN.<\/p>\n<p>This patch (of 2):<\/p>\n<p>Heartbeat callbacks stay registered while configfs local-node teardown<br \/>\nenters o2net_stop_listening().  A node-down event can still run through<br \/>\no2net_disconnect_node() and o2net_set_nn_state() while teardown is<br \/>\ndestroying o2net_wq, so the later queue\/flush operations can hit a dead<br \/>\nworkqueue.  KASAN has caught this as a slab-use-after-free in<br \/>\n__queue_work() with the call chain:<\/p>\n<p>KASAN slab-use-after-free in __queue_work+0x56\/0xa90<br \/>\nRead of size 4<br \/>\nCall trace:<br \/>\n  dump_stack_lvl+0x66\/0xa0<br \/>\n  print_report+0xce\/0x630<br \/>\n  __queue_work+0x56\/0xa90<br \/>\n  srso_alias_return_thunk+0x5\/0xfbef5<br \/>\n  __virt_addr_valid+0x19f\/0x330<br \/>\n  kasan_report+0xe0\/0x110<br \/>\n  __queue_delayed_work+0x58\/0x1e0<br \/>\n  queue_delayed_work_on+0xb4\/0xc0<br \/>\n  o2net_set_nn_state+0x467\/0x840<br \/>\n  o2net_disconnect_node+0x7b\/0xe0<br \/>\n  o2net_hb_node_down_cb+0x54\/0x60<br \/>\n  o2hb_run_event_list+0x236\/0x2d0<br \/>\n  o2hb_check_slot+0xad4\/0xbc0<br \/>\n  lock_release+0xc8\/0x290<br \/>\n  o2hb_check_slot+0x9ea\/0xbc0<br \/>\n  trace_hardirqs_on+0x18\/0x130<br \/>\n  o2hb_do_disk_heartbeat+0x646\/0xb30 (fs\/ocfs2\/cluster\/heartbeat.c:1079)<br \/>\n  __lock_acquire+0x466\/0x2260<br \/>\n  lockdep_hardirqs_on_prepare+0xea\/0x1a0<br \/>\n  ktime_get_with_offset+0xe9\/0x230<br \/>\n  o2hb_thread+0x14e\/0x770<br \/>\n  kthread+0x1ad\/0x1f0<br \/>\n  ret_from_fork+0x3c9\/0x540<br \/>\n  __switch_to+0x2e9\/0x730<br \/>\n  ret_from_fork_asm+0x1a\/0x30<br \/>\nAllocated 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  __kmalloc_noprof+0x292\/0x760<br \/>\n  __alloc_workqueue+0x736\/0xc60<br \/>\n  alloc_workqueue_noprof+0xb1\/0x110<br \/>\n  o2net_start_listening+0xe5\/0x430<br \/>\n  o2nm_node_local_store+0x184\/0x310<br \/>\n  configfs_write_iter+0x18a\/0x210<br \/>\n  vfs_write+0x469\/0x810<br \/>\n  ksys_write+0xd2\/0x170<br \/>\n  do_syscall_64+0x115\/0x6a0 (arch\/x86\/entry\/syscall_64.c:87)<br \/>\n  entry_SYSCALL_64_after_hwframe+0x77\/0x7f<br \/>\nFreed by task stack:<br \/>\n  kasan_save_stack+0x33\/0x60<br \/>\n  kasan_save_track+0x14\/0x30<br \/>\n  kasan_save_free_info+0x3b\/0x60<br \/>\n  __kasan_slab_free+0x5f\/0x80<br \/>\n  kfree+0x313\/0x590<br \/>\n  rcu_core+0x4f4\/0x1320<br \/>\n  handle_softirqs+0x156\/0x660<\/p>\n<p>queue_delayed_work_on<br \/>\no2net_set_nn_state<br \/>\no2net_disconnect_node<br \/>\no2net_hb_node_down_cb<br \/>\no2hb_run_event_list<\/p>\n<p>Keep heartbeat callbacks registered so quorum state still tracks node<br \/>\nstate, but stop them from driving o2net reconnect\/disconnect work once<br \/>\nlocal teardown starts. Mark the transport offline before destroying<br \/>\no2net_wq, wait for any in-flight heartbeat callback to finish, and delay<br \/>\nbring-up replay until the new local node is published through<br \/>\no2nm_this_node().<\/p>\n<p>The replay also has to stay serialized with heartbeat callback delivery.<br \/>\nOtherwise a live-node snapshot can be copied, a real hb_down callback<br \/>\ncan install -ENOTCONN for a peer, and the stale replay can call<br \/>\no2net_hb_node_up() for that same peer and queue reconnect work even<br \/>\nthough heartbeat is already down.<\/p>\n<p>The buggy scenario involves two paths, with each column showing the order<br \/>\nwithin that path:<\/p>\n<p>local-node teardown:                 heartbeat node-down callback:<br \/>\n1. configfs local-off enters         1. o2hb_run_event_list() invokes<br \/>\n   o2net_stop_listening().              o2net_hb_node_down_cb().<br \/>\n2. teardown heads for                2. the callback reaches<br \/>\n   destroy_workqueue(o2net_wq).         o2net_disconnect_node() and<br \/>\n                                        o2net_set_nn_state().<br \/>\n3. teardown destroys and NULLs       3. the callback flushes or queues<br \/>\n   o2net_wq.                            work through o2net_wq.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ocfs2: synchronize heartbeat callbacks with o2net teardown<\/p>\n<p>Patch series &#8220;ocfs2: harden heartbeat teardown races&#8221;.<\/p>\n<p>This series fix<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25711","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25711","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=25711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25711"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}