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