【问题标题】:stat() not working properly?stat() 不能正常工作?
【发布时间】:2013-05-29 13:54:05
【问题描述】:

我在这里做错了什么,或者 Ubuntu 12.04(最新补丁)有什么问题?一般来说,我正在编写一段 SUID 代码来做一些这样的事情,出于安全原因,我想确保程序的目标文件是常规文件,而不是其他文件,尤其是符号链接。

visti@honecker:~/Project/Images$ ls -al
total 3080
drwxrwxr-x 2 visti visti    4096 May 29 14:18 .
drwxrwxr-x 4 visti visti    4096 May 29 14:42 ..
lrwxrwxrwx 1 visti visti      10 May 29 14:18 foo -> image-ntfs
-rw-rw-r-- 1 visti visti 3145728 May 28 16:17 image-ntfs

我在这里有一个目录,其中包含一个常规文件和一个指向该文件的符号链接。在我看来 stat() 应该能够区分这两者,但它不是:

main (int argc, char **argv) {
  int i;
  struct stat buf;
  if (argc < 2) 
    exit(1);
  for (i = 1; i < argc ; i++) {
    if (stat (argv[i], &buf) == -1) {
      perror("foo");
      exit(1);
    }
    printf ("%s,%d\n", argv[i], buf.st_mode & S_IFMT);
  }
}

当我对目录运行编译程序时,这就是我得到的。这两个文件都只设置了 S_IFREG。我做错了什么?

visti@honecker:~/Project/Images$ ../stat *
foo,32768
image-ntfs,32768

【问题讨论】:

    标签: c ubuntu stat


    【解决方案1】:

    如果您想对符号链接本身进行统计,您可能需要使用lstat() 而不是stat()

    man stat

    lstat() 与 stat() 相同,除了如果 path 是符号 关联, 那么链接本身是 stat-ed,而不是它所引用的文件。

    【讨论】:

    • 另外,如果您的代码使用lstat()首先验证某事,然后执行某事,这听起来好像您的代码对race condition 开放。如果有人在这两个步骤之间用“危险”符号链接交换了经过验证的文件,则检查已被欺骗。
    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2010-11-30
    • 2021-10-02
    • 2017-08-06
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多