realpath()的安全替代方法是什么?

时间:2010-11-05 20:11:15

标签: c++ c

我正在开发一个程序,它使用realpath()来获取文件的绝对路径。不幸的是,这个函数需要一个字符串缓冲区,它预计会非常大,以至于当这个应用程序必须在多个平台上运行时,这个缓冲区就不安全了。是否有这个函数的安全版本可以避免缓冲区溢出问题,可能使用动态内存分配?

3 个答案:

答案 0 :(得分:18)

有关安全和便携使用realpath的信息,请参阅此处:

http://www.opengroup.org/onlinepubs/9699919799/functions/realpath.html

基本上,现代标准允许您传递NULL指针,realpath将分配适当长度的缓冲区。如果您希望可移植到不支持此标准的旧系统,只需检查#ifdef PATH_MAX并使用长度为PATH_MAX的固定大小缓冲区。据我所知,没有遗留系统缺少常量PATH_MAX但不支持realpath的NULL参数。

答案 1 :(得分:13)

从联系手册:

  

如果将resolved_pa​​th指定为   NULL,然后realpath()使用malloc(3)   分配最多为PATH_MAX的缓冲区   用于保存已解析路径名的字节,   并返回指向此缓冲区的指针。   调用者应该解除分配   缓冲区使用free(3).buffer使用free(3)。

所以看起来你可以这样做:

char *real_path = realpath(path, NULL);
// use real_path
free(real_path);

答案 2 :(得分:2)

有一种方法可以使用boost::filesystem在Boost中执行相同操作:

#include <boost/filesystem.hpp>

using namespace boost::filesystem;

try{
    path absolutePath = canonical("./../xxx"); //will throw exception if file not exists!

}
catch{...}{
    cout << "File not exists";
}
cout << absolutePath.string(); 

有QT方法(来自here):

QFileInfo target_file_name(argv[1]);
QString absolute_path = target_file_name.absolutePath() 

有点复杂implementation of realpath in C++。无法说出它的安全性,但它应该允许长度超过PATH_MAX的路径。要尽快测试一下。