竞争条件统计和 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()
已经为您解决了这个问题。
我正在解决一些覆盖问题,我对如何解决 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()
已经为您解决了这个问题。