Manpages

名 前

access, faccessat − ユ ー ザ ー の フ ァ イ ル へ の ア ク セ ス 権 を チ ェ ッ ク す る

書 式

#include <unistd.h>

int access(const char *pathname, int mode);

#include <fcntl.h> /* AT_* 定 数 の 定 義 */
#include <unistd.h>

int faccessat(int dirfd, const char *pathname, int mode, int flags);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

faccessat():

glibc 2.10 以 降 :

_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L

glibc 2.10 よ り 前 :

_ATFILE_SOURCE

説 明

access() は 、 呼 び 出 し 元 プ ロ セ ス が フ ァ イ ル pathname に ア ク セ ス で き る か ど う か を チ ェ ッ ク す る 。 pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 、 シ ン ボ リ ッ ク リ ン ク は 展 開 さ れ る 。

mode は チ ェ ッ ク を 行 う ア ク セ ス 権 を 指 定 す る も の で 、 そ の 値 は F_OK、 も し く は R_OK, W_OK, X_OK の 1個 以 上 の ビ ッ ト 単 位 の 論 理 和 か ら 構 成 さ れ る マ ス ク で あ る 。 F_OK は フ ァ イ ル が 存 在 す る か ど う か の み を 検 査 す る 。 R_OK, W_OK, X_OK は 、 フ ァ イ ル が 存 在 し て 、 そ れ ぞ れ 読 み 込 み 、 書 き 込 み 、 実 行 の 許 可 が あ る か を 検 査 す る 。 チ ェ ッ ク は 、 実 際 に 操 作 が 行 わ れ る 際 に 使 用 さ れ る 実 効 (effective) ID で な く 、 呼 び 出 し 元 プ ロ セ ス の 実 (real) UID と 実 (real) GID を 使 っ て 行 わ れ る 。 こ れ に よ り 、 set−user−ID プ ロ グ ラ ム で 、 プ ロ グ ラ ム を 起 動 す る ユ ー ザ ー の 権 限 を 簡 単 に 決 定 す る こ と が で き る 。 呼 び 出 し 元 プ ロ セ ス が 特 権 プ ロ セ ス (つ ま り 、 プ ロ セ ス の 実 UID が 0) の 場 合 、 通 常 の フ ァ イ ル に 対 す る X_OK の チ ェ ッ ク は 、 そ の フ ァ イ ル の 所 有 者 、 グ ル ー プ 、 他 人 の い ず れ か の 実 行 許 可 が 有 効 に な っ て い れ ば 成 功 す る 。

faccessat()
faccessat
() シ ス テ ム コ ー ル は access() と 全 く 同 様 に 動 作 す る が 、 以 下 で 説 明 す る 点 が 異 な る 。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る (access() に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 (access() と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。

pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。

flags は 以 下 に 示 す 値 の 0 個 以 上 の OR (論 理 和 ) を と っ て 作 成 さ れ る 。
AT_EACCESS
ア ク セ ス チ ェ ッ ク を 実 行 ユ ー ザ ー /グ ル ー プ ID を 使 っ て 行 う 。 デ フ ォ ル ト で は 、 faccessat() は (access() と 同 様 に ) 実 ID を 使 用 す る 。
AT_SYMLINK_NOFOLLOW

pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 、 リ ン ク の 展 開 を 行 わ な い 。 代 わ り に 、 リ ン ク 自 身 の 情 報 を 返 す 。

faccessat() の 必 要 性 に つ い て の 説 明 に つ い て は openat(2) を 参 照 。

返 り 値

成 功 し た 場 合 (要 求 し た 全 て に つ い て 許 可 が 得 ら れ た か 、 modeF_OK で フ ァ イ ル が 存 在 し た 場 合 )、 ゼ ロ が 返 さ れ る 。 エ ラ ー の 場 合 (mode の 少 な く と も 一 つ の ビ ッ ト で 要 求 し た 許 可 が な か っ た 場 合 、 modeF_OK で フ ァ イ ル が 存 在 し な か っ た 場 合 、 他 の エ ラ ー が 起 こ っ た 場 合 )、 −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

access() と faccessat() は 以 下 の 場 合 に 失 敗 す る 。

EACCES 要 求 さ れ た ア ク セ ス は そ の フ ァ イ ル 自 身 に 拒 否 さ れ た か

pathname

至 る ま で デ ィ レ ク ト リ の い ず れ か に 対 す る 検 索 許 可 (search permission) が 得 ら れ な か っ た 。 (path_resolution(7) も 参 照 の こ と )

ELOOP

pathname を 解 決 す る と き に 、 解 決 す べ き シ ン ボ リ ッ ク リ ン ク が 多 す ぎ た 。

ENAMETOOLONG

pathname が 長 過 ぎ る 。

ENOENT

pathname を 構 成 す る パ ス の い ず れ か が 、 存 在 し な い か 、 参 照 先 の な い (dangling) シ ン ボ リ ッ ク リ ン ク に な っ て い る 。

ENOTDIR

pathname の デ ィ レ ク ト リ 部 分 が 実 際 に は デ ィ レ ク ト リ で な い 。

EROFS 読 み 込 み 専 用

(read−only) の フ ァ イ ル シ ス テ ム に 対 し て 書 き 込 み 許 可

を 要 求 し た 。

access() と faccessat() は 以 下 の 理 由 に よ り 失 敗 す る こ と が あ る 。

EFAULT

pathname が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。

EINVAL

mode に 不 正 な 値 が 指 定 さ れ た 。

EIO

I/O エ ラ ー が 発 生 し た 。

ENOMEM

カ ー ネ ル に 十 分 な メ モ リ ー が な い 。

ETXTBSY 実 行 中 の フ ァ イ ル に 対 し て 書 き 込 み を 要 求 し た 。

faccessat() で は 以 下 の エ ラ ー も 発 生 す る 。

EBADF

dirfd が 適 切 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

EINVAL

flags に 無 効 な フ ラ グ が 指 定 さ れ た 。

ENOTDIR

pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

バ ー ジ ョ ン

faccessat() は バ ー ジ ョ ン 2.6.16 で Linux に 追 加 さ れ た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.4 で 追 加 さ れ た 。

準 拠

access(): SVr4, 4.3BSD, POSIX.1−2001, POSIX.1−2008.

faccessat(): POSIX.1−2008.

注 意

警 告 : あ る ユ ー ザ ー が 、 例 え ば open(2) に よ る ア ク セ ス が 可 能 か ど う か を 、 (実 際 に 行 う 前 に ) こ れ ら の シ ス テ ム コ ー ル を 使 っ て チ ェ ッ ク す る の は 、 セ キ ュ リ テ ィ ホ ー ル の 原 因 に な る 。 な ぜ な ら チ ェ ッ ク を し て か ら 実 際 に フ ァ イ ル の オ ー プ ン 操 作 を す る 間 の 短 い 間 隔 を 悪 用 で き る か ら で あ る 。 こ の 理 由 が あ る の で 、 こ の シ ス テ ム コ ー ル を 使 う の は 避 け る べ き で あ る 。 (こ こ で 説 明 し た 例 の 場 合 に は 、 よ り 安 全 な 方 法 と し て は 、 そ の プ ロ セ ス の 実 効 ユ ー ザ ー ID を 実 ユ ー ザ ー ID に 一 時 的 に 切 り 替 え て か ら open(2) を 呼 び 出 す 方 法 が あ る 。 )

access() は 常 に シ ン ボ リ ッ ク リ ン ク の 展 開 を 行 う 。 シ ン ボ リ ッ ク リ ン ク の ア ク セ ス 許 可 を 確 認 す る 必 要 が あ る 場 合 は 、 AT_SYMLINK_NOFOLLOW フ ラ グ 付 き で faccessat(2) を 使 う こ と 。

mode で 指 定 さ れ た ア ク セ ス 種 別 の い ず れ か 一 つ で も 拒 否 さ れ る と 、 た と え mode で 指 定 さ れ た 他 の ア ク セ ス 種 別 が 許 可 さ れ た と し て も 、 こ れ ら の シ ス テ ム コ ー ル は エ ラ ー を 返 す 。

POSIX.1−2001 で は 、 呼 び 出 し 元 プ ロ セ ス が 適 切 な 特 権 を 持 っ て い る 場 合 (つ ま り 、 ス ー パ ー ユ ー ザ ー の 場 合 )、 た と え フ ァ イ ル の 実 行 許 可 ビ ッ ト が 全 く セ ッ ト さ れ て い な く て も X_OK の チ ェ ッ ク と し て 成 功 を 返 す 実 装 が 認 め ら れ て い る 。 Linux は こ の よ う に は な っ て い な い 。

pathname の プ レ フ ィ ッ ク ス を 構 成 す る デ ィ レ ク ト リ の 全 て に 対 し て 検 索 ア ク セ ス (す な わ ち 、 実 行 ア ク セ ス ) が 許 可 さ れ た 場 合 に の み 、 フ ァ イ ル は ア ク セ ス 可 能 と な る 。 い ず れ か の デ ィ レ ク ト リ が ア ク セ ス 不 可 の 場 合 、 フ ァ イ ル 自 身 の ア ク セ ス 許 可 に 関 わ ら ず 、 access() は 失 敗 す る 。 ア ク セ ス ビ ッ ト の み が チ ェ ッ ク さ れ 、 フ ァ イ ル の 種 類 や 内 容 は チ ェ ッ ク さ れ な い 。 従 っ て 、 デ ィ レ ク ト リ が 書 き 込 み 可 能 と な っ た 場 合 は 、 デ ィ レ ク ト リ に フ ァ イ ル を 作 成 す る こ と が 可 能 な こ と を 意 味 す る の で あ り 、 デ ィ レ ク ト リ に フ ァ イ ル と し て 書 き 込 む こ と が で き る わ け で は な い 。 同 様 に DOS の フ ァ イ ル は 「 実 行 可 能 」 と 判 断 さ れ る が 、 execve(2) コ ー ル は 失 敗 す る だ ろ う 。 こ れ ら の シ ス テ ム コ ー ル は 、 UID マ ッ ピ ン グ を 使 用 し た NFSv2 フ ァ イ ル シ ス テ ム で は 正 常 に 機 能 し な い か も し れ な い 。 な ぜ な ら ば UID の マ ッ ピ ン グ は サ ー バ ー で 行 な わ れ 、 権 利 の チ ェ ッ ク を す る ク ラ イ ア ン ト に は 見 え な い か ら で あ る 。 (NFS バ ー ジ ョ ン 3 以 降 で は サ ー バ ー 側 で チ ェ ッ ク が 実 行 さ れ る 。 ) 同 様 の 問 題 は FUSE マ ウ ン ト で も 起 こ り 得 る 。

C ラ イ ブ ラ リ と カ ー ネ ル ABI の 違 い 生 の faccessat() シ ス テ ム コ ー ル は 、 最 初 の 3 つ の 引 き 数 だ け を 取 る 。 フ ラ グ AT_EACCESSAT_SYMLINK_NOFOLLOW は 実 際 に は faccessat() の glibc の ラ ッ パ ー 関 数 内 で 実 装 さ れ て い る 。 こ れ ら の フ ラ グ の い ず れ か が 指 定 さ れ た 場 合 、 ラ ッ パ ー 関 数 は fstatat(2) を 使 っ て ア ク セ ス 許 可 の 判 定 を 行 う 。

glibc で の 注 意
faccessat
() が 利 用 で き な い 古 い カ ー ネ ル で は 、 (フ ラ グ AT_EACCESSAT_SYMLINK_NOFOLLOW が 指 定 さ れ て い な い 場 合 ) glibc ラ ッ パ ー 関 数 は access() を 使 用 す る モ ー ド に フ ォ ー ル バ ッ ク す る 。 pathname が 相 対 パ ス の 場 合 、 glibc は dirfd 引 き 数 に 対 応 す る /proc/self/fd の シ ン ボ リ ッ ク リ ン ク に 基 づ い て パ ス 名 を 構 成 す る 。

バ グ

バ ー ジ ョ ン 2.4 (と そ れ 以 前 ) の カ ー ネ ル に は 、 ス ー パ ー ユ ー ザ ー で の X_OK の チ ェ ッ ク の 扱 い に 奇 妙 な 点 が あ る 。 デ ィ レ ク ト リ 以 外 の フ ァ イ ル で (ユ ー ザ ー 、 グ ル ー プ 、 他 人 の ) 全 て の カ テ ゴ リ ー に つ い て 実 行 許 可 が な い 場 合 、 access() の チ ェ ッ ク で −1 が 返 る の は modeX_OK だ け が 指 定 さ れ た と き だ け で あ り modeR_OKW_OK が 一 緒 に 指 定 さ れ た 場 合 に は access() は 0 を 返 す 。 (バ ー ジ ョ ン 2.6.3 以 前 の ) 初 期 の 2.6 系 の カ ー ネ ル も 2.4 系 の カ ー ネ ル と 同 様 の 動 作 を す る 。

2.6.20 よ り 前 の カ ー ネ ル で は 、 こ れ ら の シ ス テ ム コ ー ル は フ ァ イ ル が 存 在 す る フ ァ イ ル シ ス テ ム を mount(2) す る 際 に 指 定 さ れ た MS_NOEXEC フ ラ グ の 効 果 を 無 視 し て い た 。 カ ー ネ ル 2.6.20 以 降 で は 、 MS_NOEXEC フ ラ グ は 考 慮 さ れ る よ う に な っ て い る 。

関 連 項 目

chmod(2), chown(2), open(2), setgid(2), setuid(2), stat(2), euidaccess(3), credentials(7), path_resolution(7), symlink(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。