概要
- ripgrep 15.2.0 をOpenSUSE Tumbleweed Linux x86_64で利用時のバグ報告
- 非常に大規模なファイルツリー を高並列で検索するとSIGSEGVクラッシュが発生
- musl libcのmallocng/calloc 経由でopendir呼び出し時に発生
- 再現手順 やクラッシュ時のバックトレース情報を詳細に記載
- 期待動作 はセグフォルトしないこと
ripgrep 15.2.0のSIGSEGVクラッシュ報告
- ripgrep 15.2.0 (rev e89fff8)を利用
- pcre2, simd(SSE2, SSSE3, AVX2) サポート
- PCRE2 10.45(JIT有効)
- インストール方法
- OpenAI Codexバンドル版、または公式リリースバイナリ(x86_64-unknown-linux-musl)
- デバッグシンボル付きでcross build(CROSS_CONTAINER_ENGINE=podman CARGO_PROFILE_RELEASE_DEBUG=true ~/.cargo/bin/cross build --release --target x86_64-unknown-linux-musl)
- OS環境
- OpenSUSE Tumbleweed Linux x86_64
- バグ内容
- x86_64-unknown-linux-musl向けにビルドしたripgrepで、 大規模なディレクトリツリー を高並列で検索時、 SIGSEGV (セグメンテーションフォールト)発生
- クラッシュ箇所は musl libcのmallocngのメタデータ整合性アサーション
- opendirからcalloc経由で発生
- 再現手順
- generate_repro_tree.py を実行し、約20GiB/180万ファイルのツリーを生成
- そのツリーのルートで、存在しない文字列を rgで無限ループ検索
- 例:
while true; do rg tnoheueunotshisnthukoethnsueothnsiuothonesuioseuinth; done
- 例:
- 24コア/十分なRAM環境で1分ほどでSIGSEGV発生
- 実際の挙動
- coredump発生
- バックトレース例(抜粋):
- get_meta → __malloc_allzerop → calloc → opendir → std::sys::fs::unix::readdir → ...
- Rustの標準ライブラリ、ignore crateのwalk処理、スレッド生成、バックトレース取得などが呼び出しスタックに確認
- 期待される挙動
- セグメンテーションフォールトが発生しないこと
- 正常に検索が完了すること
追加情報・参考
- core dumpおよび該当rgバイナリ も取得済み
- 根本原因 はmusl libcのmallocng内部のヒープメタデータ破損によるものと推測
- 大規模並列ファイルアクセス 時のmallocngの脆弱性やripgrepのスレッドセーフティに問題の可能性
ripgrepやmusl libc利用者へのアドバイス
- 大規模ディレクトリ での高並列検索時は注意
- glibcターゲット でのビルドや並列度制限も暫定回避策
- ripgrepやmusl libcのアップデート 状況を随時確認
- バグレポート提出時は再現手順・環境・バックトレース を詳細に添付