CVE-2022-49850 in Linux
Riassunto
di VulDB • 19/06/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
nilfs2: correzione del deadlock in nilfs_count_free_blocks()
Può verificarsi un deadlock del semaforo se nilfs_get_block() rileva una corruzione dei metadati durante la ricerca dei blocchi dati e contemporaneamente avviene un writeback del superblock:
task 1 task 2 ------ ------ * Operazione su file * nilfs_truncate() nilfs_get_block() down_read(rwsem A) <-- nilfs_bmap_lookup_contig() ... generic_shutdown_super() nilfs_put_super() * Preparazione alla scrittura del superblock * down_write(rwsem B) <-- nilfs_cleanup_super() * Rilevamento corruzione b-tree * nilfs_set_log_cursor() nilfs_bmap_convert_error() nilfs_count_free_blocks() __nilfs_error() down_read(rwsem A) <-- nilfs_set_error() down_write(rwsem B) <--
*** DEADLOCK ***
In questo scenario, nilfs_get_block() acquisisce il lock di lettura su rwsem A (= NILFS_MDT(dat_inode)->mi_sem) e successivamente chiama nilfs_bmap_lookup_contig(), ma se l'operazione fallisce a causa di una corruzione dei metadati, viene chiamato __nilfs_error() da nilfs_bmap_convert_error() all'interno della sezione protetta dal lock.
Poiché __nilfs_error() chiama nilfs_set_error() a meno che il filesystem non sia in sola lettura, e nilfs_set_error() tenta di acquisire il lock di scrittura su rwsem B (= nilfs->ns_sem) per eseguire il writeback del superblock in modalità esclusiva, si verifica un'acquisizione gerarchica dei lock nell'ordine rwsem A -> rwsem B.
Se un altro task inizia ad aggiornare il superblock, potrebbe acquisire il lock di scrittura su rwsem B durante la sequenza di lock sopra descritta, andando in deadlock tentando di acquisire il lock di lettura su rwsem A in nilfs_count_free_blocks().
Tuttavia, non vi è effettivamente alcuna necessità di acquisire rwsem A in nilfs_count_free_blocks(), poiché tale funzione, all'interno della sezione protetta dal lock, legge solo un singolo dato intero da una struct condivisa con nilfs_sufile_get_ncleansegs(). Questa situazione è presente già dopo il commit aa474a220180 ("nilfs2: add local variable to cache the number of clean segments"), ovvero anche prima che questo bug fosse introdotto.
Pertanto, questo commit risolve il problema di deadlock semplicemente evitando di acquisire il semaforo in nilfs_count_free_blocks().
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.