小编Mak*_*con的帖子

stat(),fstat(),lstat()和fopen(); 如何编写TOCTOU保护系统独立代码

我已经处理了几个星期的问题,现在更新需要独立于系统的20年代码(适用于Linux和Windows).它涉及检查时间,使用时间(TOCTOU)问题.我在这里做了一个帖子,但它没有走得太远,经过一段时间的反复思考并深入研究这个问题,我想我更好地理解了我的问题.也许我可以再问一下......

根据我的阅读,代码需要检查文件是否存在,是否可访问,打开文件,执行某些操作,最后关闭文件.似乎最好的方法是调用lstat(),调用fopen(),调用fstat()(以排除TOCTOU),然后执行操作并关闭文件.

但是,我一直认为lstat()并且fstat()是POSIX定义的,而不是 C标准定义的,排除了它们用于系统不可知程序的用法,同样open()不应该用于交叉兼容性.你会如何实现这个?

如果你看看我的第一篇文章,你可以看到20年前的开发人员使用C预处理器将代码切换成交叉兼容的部分,但即使我这样做,我也不知道要替换什么lstat()或者fstat()用什么(他们的windows同行).

编辑:为此帖添加了相关代码; 如果有什么不清楚请转到原始帖子

#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()); …
Run Code Online (Sandbox Code Playgroud)

c fopen fstat

7
推荐指数
1
解决办法
4183
查看次数

当size_t溢出时,"<"和">"运算符是否正常工作?

我正在研究一个更新20年代码的项目,其中许多问题都与整数溢出有关.我想确保我正确测试溢出,所以我写了一个测试程序.它的输出让我感到沮丧.这里是:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>

int main (void) {

   size_t largerNum,Num;

   largerNum = 12;
   Num = UINT_MAX;

   printf("largerNum = %u\nNum = %u\nNum + 1 = %u\n", largerNum    , Num, Num + 1);

   largerNum = Num + 1;

   printf("largerNum now = %u\n", largerNum);

   if(largerNum < Num ){
      printf("largerNum overflowed to %u\n", largerNum);
   }
   else {
      printf("largerNum did not overflow: %u\n", largerNum);
   }

   printf("Is (0 < UINT_MAX)?\n");

   (0 < UINT_MAX)?printf("YES\n"):printf("NO\n");

   printf("Is (largerNum < Num)?\n");

   (largerNum < Num)?printf("YES\n"):printf("NO\n");

   return …
Run Code Online (Sandbox Code Playgroud)

c printf overflow size-t operator-keyword

3
推荐指数
1
解决办法
105
查看次数

标签 统计

c ×2

fopen ×1

fstat ×1

operator-keyword ×1

overflow ×1

printf ×1

size-t ×1