2013-05-29 2 views
2

내가 여기서 잘못했거나 우분투 12.04에 문제가 있습니까? (최신 패치)? 일반적으로 나는 약간의 SUID 코드를 작성하여 약간의 작업을하고 있으며, 보안상의 이유로 프로그램 대상 파일이 일반 파일이 아닌 다른 어떤 것, 특히 symlink인지 확인하고 싶습니다.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 

나는 여기에 일반 파일과 디렉토리와 파일에 대한 심볼릭 링크가 있습니다. 내 의견 합계()에서이 두 가지를 구별 할 수 있어야하지만이되지 않습니다 :

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 혼성 아니라 그것이 참조하는 파일 인 것을 제외하고) (찍으 동일하다.

+0

그게 전부입니다. 감사. – Hannu

+0

또한 'lstat()'를 사용하여 * 처음 * 무언가를 확인한 다음 코드를 실행하면 코드가 [경쟁 조건] (http://en.wikipedia.org/wiki/Race_condition)에 열려있는 것처럼 들립니다. 어떤 것. 누군가가이 두 단계 사이에 "위험한"심볼릭 링크로 유효성이 검사 된 파일을 교환하면 수표가 속은 것입니다. – unwind

관련 문제