【发布时间】:2019-08-20 07:31:40
【问题描述】:
我有这个功能,将文件复制到镜像目录,然后删除旧的。它运行良好,但是在 Coverity 中,我的代码显示为 TOCTTOU 警告。
void function(){
const char *original_key = "path/to/file/filename";
const char *mirror_key = "path/to/another/file/filename";
if((access(original_key, F_OK) == 0) && (access(mirror_key, F_OK) == 0)){
copy_file("/bin/cp %s %s", original_key, mirror_key); /*copy function in another cpp file*/
unlink(original_key);
}
}
/* in another cpp file */
int copy_file(const char*command, ...){
int rc = -1;
va_list args;
char *buffer = NULL;
va_start(args, command);
vasprintf(&buffer, command, args);
va_end(args);
if (buffer)
{
char *wrd;
char *ptr = buffer;
std::vector<const char *> list;
while ((wrd = strsep(&ptr, " ")) != NULL)
{
if (strlen(wrd))
{
list.push_back(wrd);
}
}
if (list.size() > 0)
{
char *argv[list.size() + 1];
for (size_t idx = 0; idx < list.size(); idx++)
{
argv[idx] = (char *)list[idx];
}
argv[list.size()] = NULL;
rc = system_spawn_args(argv);
}
free(buffer);
}
return(rc);
}
在这种情况下有没有办法防止TOCTTOU?
注意:移动不起作用 - 跨设备错误。
谢谢
【问题讨论】:
-
缺少很多代码。所以,很难判断。我猜实际上“original_key”和“mirror_key”有不同的内容。此外,“访问”检查文件而不是路径。还有,你如何复制?如何打开镜像文件?我认为,缺少这些重要信息。顺便提一句。我只遇到过来自 Coverity 的极少数误报。和 QAC 或者 SonarCube 或者 Lint 相比,确实靠谱(我个人经验……)
-
这非常依赖于应用程序。原文件不删除有多大问题?
-
@Armin Montigny - 根据您的问题添加了缺失的部分。我希望这会有所帮助
-
@user1937198 - 我需要实际删除它
-
@JezT 如果文件在传输过程中丢失,会有问题吗?如果是这样,您可以打开文件,将其删除,然后将内容复制到新位置?
标签: c++ file-handling coverity tocttou