C++ 中缓冲区溢出安全的 readlink()
问题:
你想使用 readlink() 获取符号链接指向的文件或目录,但你不知道存储符号链接目标所需的缓冲区大小。你不想分配大量内存(无论你选择多少,总是可能不够),但你不想冒缓冲区溢出的风险。
解决方案:
如果缓冲区太小,readlink() 返回 -1 且 errno == EINVAL。因此,你可以简单地以递增的缓冲区大小迭代调用 readlink。
此实现使用 std::string 并在出错时返回空字符串(在这种情况下 errno 仍然被设置)。如果文件不是符号链接,则返回 filename 参数。
safe_readlink.cpp
//版权所有 (c) 2013 Uli Köhler
//许可证:Apache2.0
#include <unistd.h>
/**
* C++ 的缓冲区溢出安全 readlink() 包装器。
* @return 包含 readlink() 过的文件名的字符串,或
* 空字符串且 errno 设置为相应的错误。
* 有关 errno 详情请参见 readlink() man(2)。
*/
static std::string safeReadlink(const std::string& filename) {
size_t bufferSize = 255;
//增加缓冲区大小直到缓冲区足够大
while (1) {
char* buffer = new char[bufferSize];
size_t rc = readlink (filename.c_str(), buffer, bufferSize);
if (rc == -1) {
delete[] buffer;
if(errno == EINVAL) {
//我们知道 bufsize 是正数,所以
// 文件不是符号链接。
errno = 0;
return filename;
} else if(errno == ENAMETOOLONG) {
bufferSize += 255;
} else {
//errno 仍然包含错误代码
return "";
}
} else {
//成功!rc == 缓冲区中的有效字符数
errno = 0;
return string(buffer, rc);
}
}
}Check out similar posts by category:
C/C++
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow