CVE-2022-49850 in Linux
Zusammenfassung
von VulDB • 29.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
nilfs2: Behebung einer Deadlock-Situation in nilfs_count_free_blocks()
Ein Semaphore-Deadlock kann auftreten, wenn nilfs_get_block() eine Metadaten-Korruption erkennt, während Datenblöcke gesucht werden, und gleichzeitig eine Superblock-Writeback-Operation stattfindet:
task 1 task 2 ------ ------ * Eine Dateioperation * nilfs_truncate() nilfs_get_block() down_read(rwsem A) <-- nilfs_bmap_lookup_contig() ... generic_shutdown_super() nilfs_put_super() * Vorbereitung zum Schreiben des Superblocks * down_write(rwsem B) <-- nilfs_cleanup_super() * Erkennung einer B-Baum-Korruption * 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 ***
Hierbei sperrt nilfs_get_block() rwsem A (= NILFS_MDT(dat_inode)->mi_sem) mit einem Leselock und ruft dann nilfs_bmap_lookup_contig() auf. Wenn dieser Aufruf aufgrund einer Metadaten-Korruption fehlschlägt, wird __nilfs_error() aus nilfs_bmap_convert_error() innerhalb des gesperrten Abschnitts aufgerufen.
Da __nilfs_error() nilfs_set_error() aufruft, sofern das Dateisystem nicht schreibgeschützt ist, und nilfs_set_error() versucht, rwsem B (= nilfs->ns_sem) mit einem Schreiblock zu sperren, um den Superblock exklusiv zurückzuschreiben, erfolgt die hierarchische Lock-Akquise in der Reihenfolge rwsem A -> rwsem B.
Wenn nun ein anderer Task beginnt, den Superblock zu aktualisieren, kann er während der oben genannten Lock-Sequenz rwsem B mit einem Schreiblock sperren und in einen Deadlock geraten, wenn er versucht, in nilfs_count_free_blocks() rwsem A mit einem Leselock zu sperren.
Es besteht jedoch tatsächlich kein Bedarf, rwsem A in nilfs_count_free_blocks() zu sperren, da diese Funktion innerhalb des gesperrten Abschnitts lediglich eine einzelne Ganzzahldatenstruktur aus einer gemeinsam genutzten Struktur mit nilfs_sufile_get_ncleansegs() liest. Dies war bereits nach dem Commit aa474a220180 („nilfs2: add local variable to cache the number of clean segments“) der Fall, also selbst noch bevor dieser Bug eingeführt wurde.
Daher wird das Deadlock-Problem dadurch behoben, dass das Semaphore in nilfs_count_free_blocks() einfach nicht gesperrt wird.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.