yash: 実行可能の判定が間違っていた
ファイルが実行可能かどうかの判定が間違っていた。
これまでは stat の結果 st に対して S_ISREG(st.st_mode) && !!(st.st_mode & S_IXUSR)
で判定していた。これはファイルが通常のファイルでかつファイルの所有者に実行可能フラグ (rwx の x) がある、という意味なので、自分がファイルの所有者でない場合に判定を誤る可能性がある。
何とも恥ずかしいバグだがこれまで発覚しなかったのはファイルの所有者・グループユーザ・他のユーザとで実行可能フラグが異なっていることがほとんどないという Unix の特徴のせいだろう。最初に isexecutable 関数を書いた時に勘違いしてずっと気付かなかった。
正しい判定は、stat の結果に対して S_ISREG で通常のファイルかどうかを判定し、さらに access 関数で実行可能かどうかを判定する。
| 固定リンク
コメント
よく考えたら、access 関数だと、実ユーザ ID と実効ユーザ ID が違う場合や実グループ ID と実効グループ ID が違う場合に本来とは異なる結果を返す可能性があるな。eaccess 関数とかを使わないとだめっぽい。
投稿: まじかんと | 2008年10月12日 (日) 14時33分