Skip to content

ACLが保存・復帰されない (Cygwinの属性の保存) #244

@k-takata

Description

@k-takata

os_win32.c には、mch_get_acl(), mch_set_acl() という関数がありますが、これらが機能していないことに気づきました。
問題点は以下の通り。

  1. mch_get_acl() で Owner, Group, DACL, SACL を取得しようとしているが、SACL を取得するには、SE_SECURITY_NAME 権限が有効になっていなければならない。(admin権限でプログラムを起動した上に、プログラム自身で SE_SECURITY_NAME 権限を有効化しなければならない。)
  2. Owner, Group は通常権限で取得・設定が可能とは限らない。
  3. そもそもマルチバイトファイル名に全く対応していない。

修正パッチを作ってみました。
https://gist.github.com/3489193

処理の概要は次の通り。

  1. 初期化時に SE_SECURITY_NAME 権限の有効化を試みる。
  2. Owner, Group, DACL, SACL の取得を試みる。権限不足で失敗した場合は、DACL のみ取得する。
  3. セキュリティ情報設定の際は、取得できたものだけを設定する。(DACL のみの設定であれば、自分が Owner のファイルは admin 権限は不要。)
  4. DACL 設定の際は、親ディレクトリの DACL を継承しないようにする。
  5. マルチバイト文字に対応。

このパッチにより、:set backupcopy=auto でも Cygwin のパーミッションが保持されます。(644 が勝手に 755 に変わったりしない。)
なお、Owner, Group の取得・設定にはどういう権限が必要かは、まだよく把握していません。
SACLが何なのか、保存が必要かどうなのかもまだよく分かっていません。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions