C语言 SVN文件描述符损坏

qxgroojn  于 2023-01-29  发布在  其他
关注(0)|答案(1)|浏览(154)

我正在查看SVN的源代码,在源代码中发现了这条注解。

/* The following makes sure that file descriptors 0 (stdin), 1
   (stdout) and 2 (stderr) will not be "reused", because if
   e.g. file descriptor 2 would be reused when opening a file, a
   write to stderr would write to that file and most likely
   corrupt it. */

后面跟着这个代码:

if ((fstat(0, &st) == -1 && open("/dev/null", O_RDONLY) == -1) ||
    (fstat(1, &st) == -1 && open("/dev/null", O_WRONLY) == -1) ||
    (fstat(2, &st) == -1 && open("/dev/null", O_WRONLY) == -1))
  {
    if (error_stream)
      fprintf(error_stream, "%s: error: cannot open '/dev/null'\n",
              progname);
    return EXIT_FAILURE;
  }

我不明白“重复使用”文件描述符怎么会损坏文件。你怎么能打开一个带有文件描述符2(stderr)的文件?打开一个文件怎么会影响到对stderr的写入?

jecbmhm3

jecbmhm31#

恐怕我不知道这段代码设计用来解决的特定于SVN的问题(它是在18年前提交的),但我认为下面的总结描述了高层的潜在问题,所以我假设有问题的代码部分防止了这种情况的发生:
长期以来的Unix实践规定,应用程序分别在文件描述符0、1和2上以标准输入、输出和错误I/O流启动。这些文件描述符将被正确设置的假设是如此强烈,以至于大多数开发人员从未想过检查它们。因此,如果应用程序在一个或多个标准文件描述符关闭的情况下运行,会发生有趣的事情。
例如,考虑运行一个关闭了文件描述符2的程序。程序打开的下一个文件将被分配该描述符。如果程序写入(它认为是)标准错误流,则输出将转到另一个已打开的文件,可能会损坏该文件。恶意用户可以很容易地用这种方式制造混乱;当涉及setuid程序时,潜在的后果会更糟。
取自https://lwn.net/Articles/347815/
PS检查这部分代码的svn blame。它有一个日志消息描述这些检查的目的。

相关问题