2016-06-20 8 views
1

Coverity가 불평합니다. toctou : check 함수 후 DIR을 사용하는 함수 mkdir을 호출합니다. 이것은, 내가stat와 mkdir을 순서대로 포함하는 경쟁 조건

if (mkdir(NDUID_DIR, 0755) < 0) 
{ 
    if(errno != EEXIST) 
    { 
     return ERROR; 
    } 
} 

을 확인 존재 전용 파일에 대한 통계를 사용했다하는 코드를 변경 충분

if (stat(DIR, &st) != 0) 
{ 
    if (mkdir(DIR, 0755) < 0) 
    { 
     return ERROR; 
    } 
} 

시간의 사용이 경쟁 조건, 시간의 검사를 일으킬 수 있습니다 코드를 수정하는 더 좋은 방법이 있습니까?

답변

1

코드 조각이 모두 잘못되거나 불완전한 것으로 보입니다. 대상 파일이 존재하는 경우

오픈 BSD에서

, sys_mkdirreturn-1 것, 그리고 EEXISTerrno로 설정. 그러나 대상 파일이 디렉토리라는 것을 보증하지는 않습니다. 기존 정규 파일은 여전히 ​​mkdir(2)이 정확히 동일한 EEXIST을 반환하게됩니다.

것은 널리 인정 방법의 지침, mkdir(1)-p option은 즉시 연속적으로 보장하기 위해 S_ISDIR 매크로를 실행 stat(2)를 호출 나타나는 모든 mkdir(2)'s 오류에있는의 BSD의 (bin/mkdir/mkdir.c#mkpath in OpenBSDNetBSD)를 통해 구현되는 방법을 살펴 기존 파일이 디렉토리이고 다른 유형의 파일이 아니라는 것입니다.