2016-06-20 20 views
1

のカバー率が発生します。 toctou:チェック関数の後にDIRを使用する関数mkdirを呼び出します。これは、私がstatとmkdirを順番に含む競合条件

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

をチェックして存在するファイルのみのためのstatを使用していたために、コードを変更するには十分です

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

時間の使用競合状態、時間のチェックを引き起こす可能性がありますコードを修正する良い方法はありますか?

答えて

1

両方のスニペットが間違っているか、不完全なようです。 OpenBSDのオン

sys_mkdirだろうreturn-1、およびターゲットファイルが存在する場合EEXISTerrnoを設定します。ただし、それはターゲットファイルがディレクトリであることを保証するものではありません。既存の通常のファイルでも、mkdir(2)はまったく同じEEXISTを返します。広く受け入れられている方法のガイダンスについては

mkdir(1)-p optionは、mkdir(2)'sエラー時に、すぐに確保するために、その後、マクロS_ISDIRを実行するために、stat(2)を呼び出すように見えるすべてがのBSD(bin/mkdir/mkdir.c#mkpath in OpenBSDNetBSD)、全体に実装されているかを見てみましょう既存のファイルがディレクトリであり、他の種類のファイルではないことを意味します。

関連する問題