stat和mkdir顺序的竞争条件
隐蔽性使人抱怨。toctou:调用函数mkdir,在check函数之后使用DIR。这可能导致检查时间、使用时间和竞争条件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)
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在出现错误时都会立即调用以随后运行宏,以确保现有文件是目录,而不仅仅是任何其他类型的文件