LINUX.ORG.RU

Нашёл способ баг быстро воспроизводить. Открываешь директорию в Thunar, и в ней же в терминале запускаешь:

touch file0; for i in {0..1000000}; do mv file$i file$((i+1)); done
i-rinat ★★★★★
()

Странный код в /thunar/thunar-file.c. Там есть хеш-таблица file_cache, отображающая GFile * в ThunarFile *. При вставке в таблицу берётся ссылка на GFile, но не берётся на ThunarFile. То есть таблица не владеет значениями. Вместо этого в thunar_file_finalize() соответствие удаляется из file_cache.

Выходит так, что если в одной нити убрать последнюю ссылку на экземпляр ThunarFile, а в другой вызвать thunar_file_get(), та может вернуть освобождённый экземпляр.

i-rinat ★★★★★
()
Ответ на: комментарий от VictimOfLoveToLinux

Не, это другое. В кеше лежат указатели на объекты, которые могут быть удалены в любой момент. Удаляются из кеша они в деструкторе объекта. То есть существует незащищённый блокировкой зазор, в котором другой поток может получить уже обречённый на удаление объект и увеличить ему счётчик ссылок. Use-after-free.

i-rinat ★★★★★
()
Ответ на: комментарий от greenman

Я не знаю, как это починить. Возможно, это и нельзя починить, не ломая API.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.