2013-05-29 51 views
2

我在這裏做錯了什麼,或者Ubuntu 12.04(最新的補丁)有什麼問題?一般來說,我正在編寫一段SUID代碼來做一些這樣的事情,爲此,爲了安全起見,我希望確保程序所針對的文件是普通文件,而不是其他文件,最值得注意的是符號鏈接。stat()無法正常工作?

[email protected]:~/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設置。我究竟做錯了什麼?

[email protected]:~/Project/Images$ ../stat * 
foo,32768 
image-ntfs,32768 

回答

8

您可能需要使用lstat()而不是stat()如果你想要做的符號鏈接本身的統計。

man stat具有

LSTAT()是相同的STAT(),所不同的是,如果路徑是一個符號 鏈路, 則鏈路本身是STAT-ED,而不是它是指該文件。

+0

就是這樣。謝謝。 – Hannu

+0

另外,如果你的代碼使用'lstat()'來*首先*驗證一些東西,那麼聽起來好像你的代碼對[競爭條件]是開放的(http://en.wikipedia.org/wiki/Race_condition),然後這樣做一些東西。如果有人用這兩個步驟之間的「危險」符號鏈接替換驗證過的文件,該檢查就被愚弄了。 – unwind