主要脆弱性情報 問題の説明: - が失敗した場合(ビオが満杯のため)、 は によってI/Oリクエストを送信し、新しいI/Oリクエストを割り当てる必要がある。この際、空の が使用され、その後 の呼び出しが再試行される。 - しかし、この時点で がすでに呼び出されており、これにより が増加する。再試行時に が再度呼び出されるが、対応する の呼び出しは永遠に行われない。その結果、folio が永遠にロックされた状態となり、待機中のすべてのスレッドが でブロックされる。 トリガー条件: - このバグはコミット ce63cb62d794 によって導入されたが、実際には到達不能だった。なぜなら、 には 256 個の folios を収める余裕があったからである。コミット 9f74ae8c9ac9 によって配列の容量が 16 個の folios に減らされてから、このバグをトリガーしやすくなった。 - ユーザースペースから明示的に readahead を呼び出すことで、このバグをトリガーできる。例: 修正措置: - は、 の成功後でのみ呼び出す必要がある。これは安全である。非同期完了時に が呼び出されても folio はロック解除されない。なぜなら、 は最終的に解放するまで参照を保持しているためである。 関連コミット: - Fixes: ce63cb62d794 ("erofs: support unencoded inodes for fileio") - Fixes: 9f74ae8c9ac9 ("erofs: shorten bvecs[] for file-backed mounts") 署名とレビュー: - Signed-off-by: Max Kellermann - Reviewed-by: Gao Xiang - Tested-by: Hongbo Li - Signed-off-by: Greg Kroah-Hartman