我一直在处理一个问题,现在需要更新20年的代码,这些代码需要独立于系统(可以在Linux和Windows上运行)。它涉及检查时间(Time-of-Check),使用时间(TOCTOU)问题。我做了一个线程here,但它并没有走得太远,在反复思考了一段时间并深入研究这个问题之后,我想我理解我的问题会好一点。也许我可以问得更好一点...stat(),fstat(),lstat()和fopen();如何编写TOCTOU受保护的系统独立代码
从我读过的代码需要检查文件是否存在,是否可访问,打开文件,做一些操作,最后关闭文件。看起来最好的方法是致电lstat()
,致电fopen()
,致电fstat()
(以排除TOCTOU),然后执行操作并关闭文件。
不过,我已经带领相信lstat()
和fstat()
被POSIX定义,不 C标准定义,排除了他们对系统无关的程序使用,多以同样的方式open()
不应该被用于交叉兼容性。你将如何实现这一点?
如果你看at my first post,你可以看到从20年前开发人员使用C预处理程序来削减代码为跨平台兼容性的部分,但即使我这样做,我不知道是什么,以取代lstat()
或fstat()
(他们的窗口对应)。
编辑:添加abreviated代码到这个职位;如果有什么不清楚please go to the original post
#ifdef WIN32
struct _stat buf;
#else
struct stat buf;
#endif //WIN32
FILE *fp;
char data[2560];
// Make sure file exists and is readable
#ifdef WIN32
if (_access(file.c_str(), R_OK) == -1) {
#else
if (access(file.c_str(), R_OK) == -1) {
#endif //WIN32
char message[2560];
sprintf(message, "File '%s' Not Found or Not Readable", file.c_str());
throw message;
}
// Get the file status information
#ifdef WIN32
if (_stat(file.c_str(), &buf) != 0) {
#else
if (stat(file.c_str(), &buf) != 0) {
#endif //WIN32
char message[2560];
sprintf(message, "File '%s' No Status Available", file.c_str());
throw message;
}
// Open the file for reading
fp = fopen(file.c_str(), "r");
if (fp == NULL) {
char message[2560];
sprintf(message, "File '%s' Cound Not be Opened", file.c_str());
throw message;
}
// Read the file
MvString s, ss;
while (fgets(data, sizeof(data), fp) != (char *)0) {
s = data;
s.trimBoth();
if (s.compare(0, 5, "GROUP") == 0) {
//size_t t = s.find_last_of(":");
size_t t = s.find(":");
if (t != string::npos) {
ss = s.substr(t+1).c_str();
ss.trimBoth();
ss = ss.substr(1, ss.length() - 3).c_str();
group_list.push_back(ss);
}
}
}
// Close the file
fclose(fp);
}
我认为有特定的Windows API功能,可以帮助你分开编写Windows部分。 –
您可以为每个操作系统使用包装模块,并使用条件构建。 – Olaf
@iharob任何想法他们可能被称为?我刚刚离开学校,我们从来没有使用过任何windows api,完全是gnu;也许是开始学习的好资源? – Makenbaccon