2016-06-20 7 views
1

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

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

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

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

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

ответ

1

Оба этих фрагмента выглядят неверными и/или неполными.

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

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