竞争条件统计和 mkdir

Race condition stat and mkdir

我正在解决一些覆盖问题,我对如何解决 toctou for stat a directory 和 make a directory 感到困惑。

////////////////////////////////////
// Make sure storage dir exists. If
// not, create it.
if( stat( dir, &statBuff ) != -1 )
{
    if( S_ISDIR( statBuff.st_mode ) )
    {
        if( (dirPtr = opendir( fabcSsrDbStorageDir )) == NULL)
        {

        }
        closedir(dirPtr);
    }
}
else
{
    ////////////////////////////////////
    // dir directory
    // does not exist- create it
    // now.
    if( (mkdir( dir, S_IRWXU )) != 0 )
    {

    }
}

请提出您的建议 谢谢

您不需要拨打 stat

调用opendir打开目录。如果它 returns 一个错误并且 errno 设置为 ENOENT,你知道它不存在,此时你调用 mkdir.

就做mkdir()。如果目录已经存在,EEXIST 会告诉你。接受零或此 return 代码以表明您现在已经以一种或另一种方式完成了 objective。 “竞争条件”不再是一个问题,因为 mkdir() 已经为您解决了这个问题。