このフラグなしでシステム上のO_Nofollowをシミュレートする良い方法は何ですか?
-
04-10-2019 - |
質問
安全にシミュレートできるようにしたいと思います open
と O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
と O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
サポートしていないシステムについて O_NOFOLLOW
. 。私は自分が求めていることをやや達成することができます:
struct stat lst;
if (lstat(filename, &lst) != -1 && S_ISLNK(lst.st_mode)) {
errno = ELOOP;
return -1;
}
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, mode);
しかし、その後、私は人種条件と、おそらくセキュリティの問題を紹介します。
私は、ユーザーだけが書くことができるダミーファイルを作成することを考えました。 touch
ing filename
, 、やっている lstat
チェックしてから使用します chmod
書き終えた後(ファイルモードのビットを修正するため)、しかし、私は何か大きなものを見落とすことができます(例: filename
存在する、通常のファイルではない、またはすでに象徴的なリンクです)。
どう思いますか?
解決
あなたの提案にはまだ人種条件があります:
- マロリーは、彼があなたにフォローしてほしいリンクを作成します。
- 君
open()
とのリンクO_CREAT
; - Malloryはリンクを通常のファイルに置き換えます。
- あなたはあなたをします
lstat()
合格するテスト(リンクではありません); - Malloryは、通常のファイルを再度リンクに置き換えます。
あなたはこれを以外のために修正することができますO_TRUNC
呼び出しによるケース fstat()
オープンファイル記述子と同様に lstat()
パス上で、そしてそれを保証します .st_dev
と .st_ino
メンバーは同じです。
ただし、使用している場合、これは機能しません O_TRUNC
- 欺ceptionを発見した頃には、手遅れです - マロリーはすでにあなたの重要なファイルの1つを切り捨てるように誘導されています。
私は、穴を排除するための伝統的な方法を信じています O_NOFOLLOW
サポートは次のとおりです。
- モードで一時ディレクトリを作成します
700
. 。エラー(または再試行)ifmkdir()
既存のディレクトリのために失敗します。 - 一時ディレクトリ内で新しいファイルを作成します。
- 使用する
rename()
一時ファイルをターゲット名にアトミックに移動します。 - 一時ディレクトリを削除します。
所属していません StackOverflow