-
Notifications
You must be signed in to change notification settings - Fork 10
Closed
Description
os_win32.c には、mch_get_acl(), mch_set_acl() という関数がありますが、これらが機能していないことに気づきました。
問題点は以下の通り。
- mch_get_acl() で Owner, Group, DACL, SACL を取得しようとしているが、SACL を取得するには、SE_SECURITY_NAME 権限が有効になっていなければならない。(admin権限でプログラムを起動した上に、プログラム自身で SE_SECURITY_NAME 権限を有効化しなければならない。)
- Owner, Group は通常権限で取得・設定が可能とは限らない。
- そもそもマルチバイトファイル名に全く対応していない。
修正パッチを作ってみました。
https://gist.github.com/3489193
処理の概要は次の通り。
- 初期化時に SE_SECURITY_NAME 権限の有効化を試みる。
- Owner, Group, DACL, SACL の取得を試みる。権限不足で失敗した場合は、DACL のみ取得する。
- セキュリティ情報設定の際は、取得できたものだけを設定する。(DACL のみの設定であれば、自分が Owner のファイルは admin 権限は不要。)
- DACL 設定の際は、親ディレクトリの DACL を継承しないようにする。
- マルチバイト文字に対応。
このパッチにより、:set backupcopy=auto
でも Cygwin のパーミッションが保持されます。(644 が勝手に 755 に変わったりしない。)
なお、Owner, Group の取得・設定にはどういう権限が必要かは、まだよく把握していません。
SACLが何なのか、保存が必要かどうなのかもまだよく分かっていません。