« yash 1.0β3 | トップページ | yash 1.1 »

2008年1月11日 (金)

yash: 実行可能の判定が間違っていた

ファイルが実行可能かどうかの判定が間違っていた。

これまでは stat の結果 st に対して S_ISREG(st.st_mode) && !!(st.st_mode & S_IXUSR) で判定していた。これはファイルが通常のファイルでかつファイルの所有者に実行可能フラグ (rwx の x) がある、という意味なので、自分がファイルの所有者でない場合に判定を誤る可能性がある。

何とも恥ずかしいバグだがこれまで発覚しなかったのはファイルの所有者・グループユーザ・他のユーザとで実行可能フラグが異なっていることがほとんどないという Unix の特徴のせいだろう。最初に isexecutable 関数を書いた時に勘違いしてずっと気付かなかった。

正しい判定は、stat の結果に対して S_ISREG で通常のファイルかどうかを判定し、さらに access 関数で実行可能かどうかを判定する。

|

« yash 1.0β3 | トップページ | yash 1.1 »

コメント

よく考えたら、access 関数だと、実ユーザ ID と実効ユーザ ID が違う場合や実グループ ID と実効グループ ID が違う場合に本来とは異なる結果を返す可能性があるな。eaccess 関数とかを使わないとだめっぽい。

投稿: まじかんと | 2008年10月12日 (日) 14時33分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: yash: 実行可能の判定が間違っていた:

« yash 1.0β3 | トップページ | yash 1.1 »