1

Coverity 抱怨 . toctou:在检查函数之后调用使用 DIR 的函数 mkdir。这可能会导致检查时间、使用时间竞争条件

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

将代码更改为是否足够好,我仅将 stat 用于文件存在检查

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

有没有更好的方法来修复代码?

4

1 回答 1

1

您的两个片段似乎都不正确和/或不完整。

在 OpenBSD 上,sys_mkdirreturn -1和 设置errnoEEXIST目标文件存在时。但是,这并不能保证目标文件是一个目录——一个现有的常规文件仍然会导致mkdir(2)返回完全相同的EEXIST.

对于被广泛接受的方法的指导,看看mkdir(1) -p选项是如何在 BSD 中实现的(bin/mkdir/mkdir.c#mkpath在 OpenBSDNetBSD中),所有这些,在mkdir(2)错误时,似乎立即调用stat(2)以随后运行S_ISDIR宏以确保现有文件是一个目录,而不仅仅是任何其他类型的文件。

于 2016-06-20T21:14:43.033 回答