CVE-2026-89491 in Linuxinformação

Sumário

de VulDB • 12/09/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

ocfs2: cluster: não dormir enquanto mantém o2hb_live_lock em o2hb_region_pin()

Série de patches "ocfs2: cluster: correções para o2hb_region_pin()", v2.

Esta série corrige três problemas relacionados no o2hb_region_pin(), todos provenientes da implementação original no commit: 58a3158a5d17 ("ocfs2/cluster: Fixar/desfixar regiões do o2hb"):

1) É chamado com o2hb_live_lock (um spinlock) mantido, mas a função configfs_depend_item() subjacente dorme (adquire rwsem de inode e fixa o sistema de arquivos). Isso aciona um BUG sob CONFIG_DEBUG_ATOMIC_SLEEP.

2) Quando chamado do callback drop_item do configfs, cria uma inversão na ordem dos locks: parent inode_lock -> root inode_lock do configfs, o que pode causar deadlock contra caminhos de desregistro do subsystem que usam root -> parent.

3) Se a fixação falhar parcialmente durante o2hb_region_inc_user(), o contador o2hb_dependent_users é vazado e regiões parcialmente fixadas nunca são liberadas, deixando as regiões de heartbeat desprotegidas em montagens subsequentes.

O Patch 1 reestrutura o2hb_region_pin() para soltar o2hb_live_lock durante cada chamada a configfs_depend_item(), que dorme, usando uma referência do config_item para manter a região viva enquanto está sem lock.

O Patch 2 adiciona um parâmetro from_callback para selecionar configfs_depend_item_unlocked() quando chamado de contexto configfs, evitando o aninhamento do inode_lock.

O Patch 3 corrige o caminho de erro em o2hb_region_inc_user() para desfixar e decrementar o contador em caso de falha.


Este patch (de 3):

o2hb_region_pin() é sempre chamado com o spinlock o2hb_live_lock mantido (vindo de o2hb_region_inc_user() e o2hb_heartbeat_group_drop_item()), mas ele chama o2nm_depend_item() -> configfs_depend_item(), que dorme: fixa o sistema de arquivos do configfs e adquire rwsem do root inode do configfs. Sob CONFIG_DEBUG_ATOMIC_SLEEP, isso aciona:

BUG: sleeping function called from invalid context at kernel/locking/rwsem.c in_atomic(): 1, ... name: mount.ocfs2 down_write configfs_depend_item o2hb_region_pin o2hb_region_inc_user o2hb_register_callback dlm_register_domain_handlers ... ocfs2_dlm_init ocfs2_mount_volume ocfs2_fill_super

Reestruturar o2hb_region_pin() para fixar uma região de cada vez, soltando o lock durante a chamada que dorme: sob o2hb_live_lock, encontre a próxima região elegível e adquira uma referência do config_item para mantê-la viva; solte o lock, chame o2nm_depend_item(), então readquira o lock e registre a fixação. O config_item_put() também é feito com o lock liberado, já que o2hb_region_release() também adquire o2hb_live_lock e pode dormir. A lista de regiões pode mudar enquanto desbloqueada, portanto, a varredura recomeça do topo após cada fixação. O heartbeat local ainda fixa apenas a região correspondente; o heartbeat global fixa todas as regiões elegíveis.

O caminho de desfixação não é afetado: configfs_undepend_item() apenas adquire um spinlock e não dorme.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Responsável

Linux

Reservar

11/09/2026

Divulgação

12/09/2026

Moderação

aceite

Entrada

VDB-402879

CPE

pronto

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Do you know our Splunk app?

Download it now for free!