dir:searchサポートの実装

id:himainu:20060215 id:himainu:20060216で失敗した、dir:searchのサポートだが、
方法をかえて再チャレンジ。今度こそうまくいった?
コンパイルフラグで -DDIRSEARCHとすると有効になる。

方針

allow/denyルールで出てくるディレクトリを親ディレクトリ含め全部別途ラベル付けする。
ドメインは,allowルールに出てくるディレクトリ(親ディレクトリ含む)のラベルにdir:searchアクセス可能。

新データ構造

  • DOMAINのメンバ dir_listハッシュテーブル
    • allowルールに出現した全ディレクトリ(親ディレクトリ含む)を登録する
    • キー:ディレクトリ名, 値:"1"
    • ★denyルールに関連するものは登録しない。denyなのにdir:searchだけがallowされるのを防ぐため。

構文解析時(action.c)

register_file_aclで、

  • all_dirs_table を構築(label_parent_dir関数)。

ドメイン毎に,dir_listハッシュテーブル構築(これはconvert_acl後に構築したほうがいいかも)

構文解析終了時(convert.c)

/foo/barの場合 dir_foo_bar_t。

type文でdir_label_tableに出現するラベル全部宣言。

dir_listハッシュテーブル構築

convert_file_acl後。

  • make_dir_list関数

allow出力時

consider_childのロジックを変える。
テーブル(dir_label_table)も参照してallow文を出力。

allow /etcを出力するとき。
まず、etcdir_tについて出力。

dir_child_buf_tableを作ってテーブルdir_label_tableから登録
dir_child_buf_tableにあるものを出力。

fcファイル出力時

一番最後に
dir_label_tableに出てくるディレクトリ全部について,
/foo -d system_u:object_r:foodir_t
みたいに出力。

結果

前の実装だと,生成されたポリシーのサイズ(バイナリポリシのルール数)
が2倍以上になり,死んでいたが、今度は。。
サポート前: 142523
サポート後:181438
まぁこんなものか。コンパイル時間も気にならない。