LINUX.ORG.RU

[C, mktemp] Что на замену?


0

0

Здравствуйте.
GCC говорит, что
warning: the use of `mktemp' is dangerous, better use `mkstemp'
В мане сказано, что
Never use mktemp(). Some implementations follow 4.3BSD and replace XXXXXX
by the current process ID and a single letter, so that at most 26 differ‐
ent names can be returned. Since on the one hand the names are easy to
guess, and on the other hand there is a race between testing whether the
name exists and opening the file, every use of mktemp() is a security
risk. The race is avoided by mkstemp(3).

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

Есть ещё tempnam и tmpnam - но там кругом "never use this function".

Как лучше поступить? :)
Спасибо.

★★

Ответ на: комментарий от true_admin

Можно и самому. Но может есть уже велосипед такой - просто я чего-то не знаю?

lv ★★
() автор топика

> Но mkstemp нужен не просто для генерации уникального имени - он тут же открывает файл с таким именем (в то время как мне, например нужна просто генерация для клиентского sockaddr_un.sun_path, то есть файл такой создавать не нужно).

Проблема в том, что если генерацию уникального имени файла и открытие этого файла разнести на две разные функции, то в любом случае получается race condition, что потенциально небезопасно. Поэтому, в манах по всем функциям, которые просто генерируют имя файла, написано "never use" =).

> Как лучше поступить? :)


Генерируй имя файла в директории, специфичной для твоей программы (типа /var/run/mysusperpuperproga). Или посмотри в сторону UUID'ов. Или используй небезопасные функции с учётом того, что файлы с таким именем уже могут существовать и имя придётся генерировать заново (при таком сценарии твоя программа может вечно генерировать случайные имена и натыкаться на существующие файлы, но это очень маловероятно и можно пренебречь). Или всё это сразу 8).

Deleted
()
Ответ на: комментарий от Deleted

Про race condition это понятно. Но про mktemp написано, что она не безопасна, так как в некоторых реализациях генерация происходит на основе pid, что даёт не очень хорошие результаты. Так вот, если более точно, то интересно именно существует ли стандартная функция, хоть и опасная по гонкам, но генерирующая всегда широкий набор имён.
Как вариант, можно, опять же использовать mkstemp и каждый раз тут же удалять этот файл и создавать сокет. Делать это в цикле - ибо возможны гонки :))) вобщем веселье ещё то :)

lv ★★
() автор топика
Ответ на: комментарий от Deleted

> UUID
Всё спасибо - вроде нашёл то, что нужно - uuid_generate*().

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