按顺序使用 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
宏如何确保现有文件是一个目录,而不仅仅是任何其他类型的文件。
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
宏如何确保现有文件是一个目录,而不仅仅是任何其他类型的文件。