RipGrep musl binaries occasionally segfault during very-large searches
В версии ripgrep 15.2.0, собираемой под x86_64‑unknown‑linux‑musl, иногда возникает SIGSEGV при поиске по очень большим каталогам при высокой степени параллелизма. Ошибка проявляется в момент вызова calloc внутри opendir, когда проверка целостности кучи в MUSL‑mallocng падает. Для воспроизведения требуется массив файлов порядка 20 GiB и 1.8 млн файлов; достаточно запустить цикл rg <незначающаяся строка> и дождаться сбоя, что обычно происходит через минуту на 24‑ядерной машине с достаточным свободным RAM. Сборка производилась с debug‑символами через cross‑toolchain, а в бинарнике включены функции PCRE2 10.45 с поддержкой JIT.
Следствие backtrace указывает, что сбой происходит в get_meta (../src_musl/src/malloc/mallocng/meta.h:141) и заканчивается в цепочке вызовов std::fs::read_dir → ignore::walk::Worker::run → std::thread::spawn. При этом в стеке виден вызов calloc из opendir и падение в std::panic::catch_unwind. Таким образом, проблема связана с некорректной работой динамического распределения памяти в MUSL при одновременном обходе большого количества директорий, что приводит к повреждению метаданных кучи и аварийному завершению процесса. Кроме того, в стеке видно, что сбой происходит в контексте пула потоков ignore::walk, где каждый поток одновременно читает каталоги, что усиливает конкуренцию и ускоряет появление ошибки.