C / C ++ Потокобезопасность tmpnam? - PullRequest
4 голосов
/ 17 июля 2009

Мне нужно использовать функцию tmpnam в C ++, но мне нужно знать о ее безопасности потоков. А именно, если у меня есть несколько потоков, каждый из которых должен будет получить другое имя для временного файла, я гарантирую, что каждый поток получит файл с другим именем?

1 Ответ

5 голосов
/ 17 июля 2009

tmpnam только гарантирует, что файл не существовал в то время - но он может быть создан до того, как вы сможете сделать это самостоятельно. Чтобы использовать его безопасно, вам ВСЕГДА нужно будет попытаться создать файл с открытым именем (имя файла, O_CREAT | O_EXCL | O_NOFOLLOW). Если это не удается из-за EEXIST или ELOOP, вернитесь и попробуйте новое имя.

Это особенно важно для защиты от атак по символическим ссылкам, когда другая программа создает символическую ссылку из имени временного файла в / etc / passwd или в другой важный файл.

Также убедитесь, что вы не передаете NULL в tmpnam, поскольку используемый буфер одинаков для всех потоков.

Другой подход, который объединяет их, заключается в использовании mkstemp () или mkostemp (), который создаст файл для вас безопасно.

Наконец, если вам не нужно имя файла, вы можете использовать tmpfile (), который создаст временный файл, который будет удален при закрытии.

...