EN JA
UCRED(9)
UCRED(9) FreeBSD Kernel Developer's Manual UCRED(9)

名称

ucred, crget, crhold, crfree, crshared, crcopy, crdup, cru2x, cred_update_threadユーザ資格証明に関連する関数

書式

#include < sys/param.h>
#include < sys/ucred.h>

struct ucred *
crget( void);

struct ucred *
crhold( struct ucred *cr);

void
crfree( struct ucred *cr);

int
crshared( struct ucred *cr);

void
crcopy( struct ucred *dest, struct ucred *src);

struct ucred *
crcopysafe( struct proc *p, struct ucred *cr);

struct ucred *
crdup( struct ucred *cr);

void
crsetgroups( struct ucred *cr, int ngrp, gid_t *groups);

void
cru2x( struct ucred *cr, struct xucred *xcr);

void
cred_update_thread( struct thread *td);

解説

ucred 関数ファミリは、カーネル中でユーザ資格証明構造体 ( struct ucred) を管理するためにに使用されます。

crget() 関数は、新しい構造体のためにメモリを割り付けて、参照カウントを 1 に設定し、そのロックを初期化します。

crhold() 関数は、資格証明で参照カウントを増加させます。

crfree() 関数は、資格証明で参照カウントを減少させます。カウントが 0 になるなら、構造体のための記憶領域は、解放されます。

crshared() 関数は、資格証明が共有されているなら、真 (true) を返します。参照カウントが 1 以上であるなら、資格証明は、共有されていると考えられます。

crcopy() 関数は、ソース (テンプレート) の資格証明の内容を宛先テンプレートにコピーします。宛先内の uidinfo 構造体は、 uihold(9) を呼び出すことによって参照されます。

crcopysafe() 関数は、プロセス p に関連している現在の資格証明を新たに割り付けられた資格証明 cr にコピーします。 p でロックされたプロセスは、保持されなければならなくて、必要に応じて cr のグループ記憶域空間を割り付けを落され、再獲得されます。

crdup() 関数は、新しい構造体のためのメモリを割り付け、それに cr の内容をコピーします。実際のコピーは、 crcopy() によって実行されます。

crsetgroups() 関数は、 cr_groupscr_ngroups 変数を設定し、必要に応じて空間を割り付けます。また、グループリストを現在のグループの最大数に切り詰めます。他のメカニズムは、 cr_groups[0] への代入を通してプライマリグループを更新することを除いて、 cr_groups 配列を変更するために使用するべきではありません。

cru2x() 関数は、 ucred 構造体を xucred 構造体に変換します。すなわち、 cr から xcr にデータをコピーします。それは、後者 (例えば、 cr_uidinfo) に存在しない前者のフィールドを無視して、前者 (例えば、 cr_version) に存在しない後者のフィールドを適切に設定します。

cred_update_thread() 関数は、必要なら、古い資格証明を解放して、 td の資格証明をそのプロセスの資格証明に設定します。

戻り値

crget(), crhold(), crdup() と crcopysafe() は、すべて、 ucred 構造体へのポインタを返します。

crshared() は、資格証明に 1 以上の参照カウントがあるなら、0 を返します。そうでなければ、1 が返されます。

使用上の注

FreeBSD 5.0 現在、 ucred 構造体は、拡張フィールドを含んでいます。これは、未使用で書き込み可能な資格証明構造体を作成するために常に正しいプロトコルに従わなければならないことを意味します: 新しい資格証明は、常に crget(), crcopy() と crcopysafe(). を使用して既存の資格証明から派生されなければなりません。

よくある例では、アクセス制御決定に必要な資格証明は、読み込み専用方法で使用されます。このような状況において、スレッド資格証明 td_ucred は、安全にアクセスするためのロックが要求されず、別のスレッドからプロセス資格証明を変更するマルチスレッド化されたアプリケーションに直面してさえ呼び出しの継続期間のために安定した状態を保つように使用されるべきです。

プロセスの資格証明の更新の間に、プロセスロックは、競合条件を防ぐために、チェックと更新にわたって保持されなければなりません。プロセスの資格証明 td->td_proc->p_ucred は、チェックと更新の両方で使用されなければなりません。プロセスの資格証明がシステムコールの間に更新され、スレッドの資格証明に対するチェックが後で同じシステムコールの間に行われるなら、スレッドの資格証明は、また、古い値の使用を防ぐためにプロセスの資格証明からリフレッシュされなければなりません。このシナリオを避けるために、プロセスの資格証明を更新するシステムコールが他の承認関数を避けるように設計されることは、お勧めです。

一時的に高い特権がスレッドに必要であるなら、スレッドの資格証明は、活動の存続期間のために、またはシステムコールの残りのために置き換えられることができます。しかしながら、スレッドの資格証明がしばしば共有されるとき、 crget() と crcopy() の使用を通して書き込み可能な資格証明で行われる変更を確実にするために、適切な注意が払われるべきです。

スレッドまたはプロセスのための承認のチェックが別のスレッドかプロセスでの操作を実行するとき、警告が行われるべきです。一時的な上昇の結果として、ターゲットスレッドの資格証明は、アクセス制御決定でターゲット資格証明として 決して 使用されるべきではありません: スレッド td->td_proc->p_ucred に関連しているプロセス資格証明が代わりに使用されるべきです。例えば、 p_candebug(9) は、アクセス制御目的のためにターゲットスレッドではなく、ターゲットプロセスを受け付けます。

関連項目

uihold(9)

作者

このマニュアルページは、 Chad David <davidc@acns.ab.ca>によって書かれました。
June 19, 2009 FreeBSD