From: Yusuke ENDOH Date: 2010-02-19T19:35:19+09:00 Subject: [ruby-dev:40447] Re: [Bug #2747] io.dup doesn't handle pos properly kosaki さん 遠藤です。 2010年2月15日21:40 Motohiro KOSAKI : > 6の秘密はstraceが教えてくれている > *snip* > > read(f2, buf, 8192)でバッファリング読み込みしたあと、オフセットを戻すのを忘れて > lseek(f1, 0, SEEK_CUR) でposを読み込むのでファイル終端のposが得られている。 dup の前後でバッファを共有していないのが問題ですよね。 しかし、バッファは現在 rb_io_t 構造体に直接埋め込まれてしまっています。 rb_io_t の定義を変えないと、バッファを共有させるのは難しい気がします。 rb_io_t は公開 API であり、etc/ 以下だけでなくいくつかの 3rd party の 拡張ライブラリで実際に使われています。下手にいじると、バイナリ互換性の 問題が起きてしまいそうです。 設計上のバグなんですが、バイナリ互換性を崩してでも修正したいほど重大な 問題ではないと思います。なので 1.9.2 では、 「IO#dup や reopen の元になった IO はもう使ってはいけない (close しかしてはならない) 。バグだが当面 WONTFIX である。」 と宣言してしまい、いつか他の要因でバイナリ互換性を捨てる際 (遅くとも 2.0) に、あわせて修正するのがいいのではないかと思いました。 もちろん、バイナリ互換性に影響のない形で修正できるなら、それが一番いい と思います (ただし、煩わしい workaround のせいでひどくメンテナンス性が 落ちるとしたら考えもの) 。 今考えている修正方針の案などがあれば教えてください。 -- Yusuke ENDOH