`cp --no-clobber` 容易受到竞争条件的影响吗?

fin*_*oot 34 linux shell security cp files

手册页cp(1)

--no-clobber 不要覆盖现有文件

但是,下面的场景是不是可能呢?

  1. cp 检查文件是否存在,假设文件不存在(还)
  2. 一些其他进程写入相同的路径,所以现在有数据写入以前不存在的文件
  3. 由于cp不知道现在存在的文件,它会覆盖数据

是否cp --no-clobber容易受到这种竞争状态?如果没有,如何cp避免上述情况?

Ste*_*itt 56

cp不容易受到这种竞争条件的影响。当--no-clobber设置,它会检查目标是否已经存在; 如果它确定它没有,因此它应该继续复制,它会记住它应该复制到一个新文件。当需要打开目标文件时,它会使用强制创建的标志打开它O_CREAT并且O_EXCL;操作系统然后在打开文件时检查该文件是否不存在,EEXIST如果存在失败 ( )。

  • 有趣的是,`cp` 会自己检查是否存在,而不是简单地用这些标志打开。 (10认同)
  • 除了这里讨论的特定条件之外,我不想就潜在的竞争条件做出任何声明;-)。除了 Linux 上的块设备,“O_EXCL”仅在与“O_CREAT”一起使用时才有意义,因此您怀疑它不能用于“--update”(以确保目的地在其时间戳为检查)。避免“--update”的竞争将需要更复杂的文件锁定方案...... (4认同)
  • @JoL 除了我的直觉之外,我没有任何来源或支持,但我敢打赌,原始版本的 cp 没有使用 O_EXCL,因此确实存在竞争条件,后来被修补通过将 open() 调用更改为使用 O_EXCL 来退出,而原来现在多余的检查从未被删除。 (2认同)