Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
stat和mkdir顺序的竞争条件_Mkdir_Stat_Coverity - Fatal编程技术网

stat和mkdir顺序的竞争条件

stat和mkdir顺序的竞争条件,mkdir,stat,coverity,Mkdir,Stat,Coverity,隐蔽性使人抱怨。toctou:调用函数mkdir,在check函数之后使用DIR。这可能导致检查时间、使用时间和竞争条件 if (stat(DIR, &st) != 0) { if (mkdir(DIR, 0755) < 0) { return ERROR; } } if(stat(DIR,&st)!=0) { if(mkdir(DIR,0755)

隐蔽性使人抱怨。toctou:调用函数mkdir,在check函数之后使用DIR。这可能导致检查时间、使用时间和竞争条件

if (stat(DIR, &st) != 0)
{
    if (mkdir(DIR, 0755) < 0)
    {
        return ERROR;
    }
}
if(stat(DIR,&st)!=0)
{
if(mkdir(DIR,0755)<0)
{
返回误差;
}
}
将代码更改为,我只使用stat检查文件是否存在,是否足够好

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

有更好的方法修复代码吗?

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

在OpenBSD上,将
返回
-1
,并将
errno
设置为目标文件存在时。但是,这并不能保证目标文件是一个目录——现有的常规文件仍然会返回完全相同的
EEXIST

对于广泛接受的方法的指导,请看一下如何跨BSD(和)实现,所有BSD在出现错误时都会立即调用以随后运行宏,以确保现有文件是目录,而不仅仅是任何其他类型的文件