race condition

By ekato

いわたさんにさらに教えて頂きました。ありがとうございます。

ところで、uim-helper.cのuim_helper_get_pathnameと prime.cのprime_get_ud_pathは、”/tmp”上に作るので、こちらは上記の問題があるのではないでしょうか。

確かに helper の socket パスは /tmp/uim-username/ とかのユーザのみ読み書きできるディレクトリを作った方がいいかもしれません。ただ現状でも uim では socket の credentials を使っているので、ユーザ以外が動かしているソケットには接続しないようになっています。

popen(というよりsh)のglobbing ruleを気にするくらいならば、昔ながらのfork, exec, pipeをすべきではないでしょうか。これだと、それぞれの段階でエラー処理を制御できるので、問題点を洗い出しやすいコードになるのではないかと思います。

一方、popenでは満足なエラー通知はできません(OpenBSD-man:popenのBUGS参照)。

なるほどエラー処理の問題ですね。そういえば以前 skk-look を使えるようにしたときuim-fep の山本さんにも uim_ipc_open_command() を使ったほうがいいと指摘されたような気がします。

uim-skk はもうかれこれ一年以上いじっていないのですが、おかしな点がありましたらどしどしパッチを送って頂けるとありがたいです。

4件のフィードバック

  1. とおりすがりの発言

    つpam-tmpdir

  2. いわたの発言

    目的の場所にすでにファイル・ディレクトリが存在したときはプログラムを終了させるべきだ、と考えている私にとって、
    事実上/tmpに固有名を持つファイル・ディレクトリは作れないものだととらえています(アトミックな操作で安全にファイルを消去するのは難しい)。

    もちろん、ファイルの操作がプログラム内で完結している(テンポラリファイル)とか、uim-fepのようにファイル名を環境変数を通してやりとりできる状態である、とかであれば、mkstemp(3)・mkdtemp(3)を使って/tmpにファイルを置くべき(/tmpの方がアクセス速度が速い場合もありますし)ですけど、単独で起動するプログラム同士が通信する場合、/tmp以下に置くのはちょっとアレかと。
    ~/の下であればその点安心してファイルアクセスできますので、こちらのほうがいいと思うのですが、いかがでしょう。

  3. ヤマケンの発言

    APIを変更しない範囲であれば、どんどん整理しちゃってください。uim_ipc_*()はちょっと実装がごちゃごちゃしてるんで、OpenBSDのpopen.cをベースに書き直した方がいいかな、とも思いましたが詳しくは見てないのでおまかせします。APIを変更したい場合は一応uim@fdoあたりに提案をお願いします。

  4. ekatoの発言

    > 事実上/tmpに固有名を持つファイル・ディレクトリは作れないもの
    > だととらえています(アトミックな操作で安全にファイルを消去する
    > のは難しい)。

    そうですね。ファイルアクセスの race condition を避けるために、helper のソケットを ~/.uim.d/ の下に作るように、あとで変更してみることにします。

コメントする