【问题标题】:How can we know there is hole in a file in C?我们如何知道 C 中的文件中存在漏洞?
【发布时间】:2021-04-10 07:23:05
【问题描述】:

来自手册页:

lseek() 允许将文件偏移设置到文件末尾之外(但这不会改变文件的大小)。如果数据稍后写入 此时,后续读取间隙(“洞”)中的数据会返回空字节('\0'),直到数据实际写入间隙。

我们在gap中读取了空字节,但是如果文件本身的数据是'\0'呢?如何区分空字节是gap​​还是文件中的'\0'数据?

【问题讨论】:

  • 看数据是看不出来的。而是跟踪您自己添加到文件中的任何漏洞。在调用lseek 之前获取当前文件大小,并使用它来跟踪将由lseek 创建的任何孔的位置和大小。
  • @kaylum 我们处理一些不是自己创建的洞文件的场景,比如复制洞文件而不将洞数据复制到新文件。

标签: c linux file


【解决方案1】:

"hole" 可能是用词不当 - 文件中确实没有字面上的孔。让我们假设一个“洞”是稀疏文件中尚未分配存储的区域。 (还)没有标准的方法来检测文件中这种未分配的存储。出于所有意图和目的,“漏洞”确实是文件的一部分,仅包含许多零字节 - 这些只是没有写入磁盘。

在某些系统上,lseek 系统调用可能支持名为 SEEK_HOLESEEK_DATA 的搜索模式。这是一个非标准扩展,出现在某些版本的 Linux、BSD 和 Solaris 中。

这些将文件指针定位到当前位于分配空间中的下一个孔(对于SEEK_HOLE)或在孔中时定位到下一个“真实”数据位置(对于SEEK_DATA)。

其他系统可能支持名为 FIEMAPioctl 将逻辑映射到物理文件位置(这也允许您检测未分配的存储)。

【讨论】:

  • 感谢您的回答,我正在做一个关于复制孔文件的练习。我想我可以使用 SEEK_HOLE 和 SEEK_DATA 来获取文件中真实数据的范围,并写入新文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2018-11-03
  • 2023-01-26
  • 2011-06-03
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多