Мне нужно выполнить много операций чтения с произвольным доступом в большом файле, поэтому я использую mmap()
.Это решение кажется идеальным, если отображаемый файл не поврежден.Но это не всегда так.Если сопоставленный файл подделан, возникает несколько проблем:
Если изменение в файле уменьшает его длину или файл становится недоступным, то процесс для жизни должен обработать SIGBUS
сигнал (по крайней мере, в реализации Linux).Это добавляет дополнительные сложности, так как я пишу библиотеку.
Чтобы сделать ситуацию еще хуже, manpage mmap()
говорит, что она не указана, если изменения в исходном файле распространяются в памяти.Так что они могут очень хорошо размножаться.По сути это означает, что содержимое файла, с которым я работаю, может в любой момент стать белым шумом.
Означает ли это, что любая программа, которая отображает свободно доступный файл и не обрабатывает этипроблемы могут быть вызваны DoS-атакой?Даже если я не ожидаю, что злые хакеры пойдут за моей программой, я легко вижу, как пользователь изменяет мой сопоставленный файл, заменяет его другим или делает файл недоступным, например, извлекая USB-накопитель ,И хотя я могу написать обработчик сигнала (и это немного грязно, поэтому я ищу лучшее решение) для решения первой проблемы, я не знаю, как решить вторую.
Файл не может быть скопирован и может свободно перемещаться, если он не используется программой (как и любой другой медиа-файл).Блокировки файлов Linux не всегда работают.
Итак, как безопасно использовать mmap()
для чтения?