Состояние гонки со статистикой и mkdir в последовательности

Покрытие жалуется. toctou: Вызов функции mkdir, которая использует DIR после функции проверки. Это может вызвать состояние гонки времени проверки, времени использования.

if (stat(DIR, &st) != 0)
{
    if (mkdir(DIR, 0755) < 0)
    {
        return ERROR;
    }
}

Достаточно ли изменить код на , я использовал stat только для проверки существования файла

if (mkdir(NDUID_DIR, 0755) < 0)
{
    if(errno != EEXIST)
    {
        return ERROR;
    }
}

Есть ли лучший способ исправить код?


person Sri Kant    schedule 20.06.2016    source источник


Ответы (1)


Оба ваших фрагмента кажутся неверными и/или неполными.

В OpenBSD sys_mkdir будет return -1, а для errno будет задано значение EEXIST при наличии целевого файла. Однако это не гарантирует, что целевой файл является каталогом — существующий обычный файл все равно приведет к mkdir(2) возвращает точно такой же EEXIST.

Чтобы получить представление о широко распространенном подходе, посмотрите, как mkdir(1) -p option реализуется в BSD. (bin/mkdir/mkdir.c#mkpath в OpenBSD и NetBSD), и все это на mkdir(2), кажется, немедленно вызывает stat(2) для затем запустите макрос S_ISDIR, чтобы убедиться, что существующий файл является каталогом, а не просто любой другой тип файла.

person cnst    schedule 20.06.2016