按顺序使用 stat 和 mkdir 的竞争条件

Race condition with stat and mkdir in sequence

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;
    }
}

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

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

在 OpenBSD 上,sys_mkdir would return -1, and set errno to EEXIST when the target file is present. However, that doesn't guarantee that the target file is a directory -- an existing regular file would still result in mkdir(2) 返回完全相同的 EEXIST

有关广泛接受的方法的指导,请查看 mkdir(1) -p option is implemented across the BSDs (bin/mkdir/mkdir.c#mkpath in OpenBSD and NetBSD), all of which, on mkdir(2)'s error, appear to immediately call stat(2) to subsequently run the S_ISDIR 宏如何确保现有文件是一个目录,而不仅仅是任何其他类型的文件。