【问题标题】:Race condition with stat and mkdir in sequence依次使用 stat 和 mkdir 的竞争条件
【发布时间】:2016-06-20 20:19:28
【问题描述】:

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;
    }
}

有没有更好的方法来修复代码?

【问题讨论】:

    标签: mkdir stat coverity


    【解决方案1】:

    您的两个 sn-ps 似乎都不正确和/或不完整。

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

    要获得广泛接受的方法的指导,请查看如何在 BSD(bin/mkdir/mkdir.c#mkpath in OpenBSDNetBSD)中实现 mkdir(1) -p option,所有这些都在出现 mkdir(2)'s 错误时立即调用 @987654328 @ 以随后运行 S_ISDIR 宏以确保现有文件是一个目录,而不仅仅是任何其他类型的文件。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 2020-07-12
      • 2011-12-12
      • 2019-02-10
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      相关资源
      最近更新 更多