[#46309] [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — "usa (Usaku NAKAMURA)" <usa@...>

13 messages 2012/10/29
[#46310] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — Tanaka Akira <akr@...> 2012/10/29

2012年10月29日 10:31 usa (Usaku NAKAMURA) <[email protected]>:

[#46366] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — "U.Nakamura" <usa@...> 2012/11/02

こんにちは、なかむら(う)です。

[#46375] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — KOSAKI Motohiro <kosaki.motohiro@...> 2012/11/02

>> とくに指定しなければ、default external は locale から設定されるので、

[ruby-dev:46208] [ruby-trunk - Bug #7040] gem install で特定の gem がインストールできない

From: "nagachika (Tomoyuki Chikanaga)" <nagachika00@...>
Date: 2012-10-07 15:29:10 UTC
List: ruby-dev #46208
Issue #7040 has been updated by nagachika (Tomoyuki Chikanaga).

File zlib_inflate_buf_error.patch added
Category changed from core to ext
Assignee changed from drbrain (Eric Hodel) to nagachika (Tomoyuki Chikanaga)

Hello,

I've investigated this little more deeper.

If inflate() (aka z->func->run()) return under condition which z->stream.avail_in == z->stream.avail_out == 0, current zstream_run_func() call inflate() once more even though there's no input available. In that case inflate() return Z_BUF_ERROR.

However, deflate() have hidden input buffer in z->stream.state (opaque structure) and should be called even when z->stream.avail_in == 0 (while z->stream.avail_out == 0).

I think zstream_run_func() should break from while loop when zstream->avail_in == 0 only if z->func->run == inflate.

I will commit an attached patch tomorrow if there's no objection.

ruby-dev なので日本語でも。

もう少し調べてみました。

zstream_run_func() で inflate() (z->func->run()) がたまたま入出力のバッファがぴったり空/一杯になった (z->stream.avail_in == z->stream.avail_out == 0) で返ってきた時に、今の実装だとバッファを拡張して再度 inflate() を呼んでしまいます。zlib は入力が既にない状態で inflate() を呼ぶと Z_BUF_ERROR を返すようです。

ただ deflate() の場合は不可視な z->stream->state の構造体の中に隠れたバッファを持っているようで、z->stream.avail_in == 0 でももう一度 deflate() を呼ぶ必要がある場合があるようです。

添付したパッチのように z->func->run が inflate の時に限り z->stream.avail_in == 0 の時にも zstream_run_func() の while ループから抜けて、余分に inflate() (z->func->run())を呼ばないようにしてはどうかと思います。 make test-all は手元の環境では通りました。
実際に gem がインストールできない問題で困っているということなので、特に反対がなければ明日にでもコミットしておこうと思います。
----------------------------------------
Bug #7040: gem install で特定の gem がインストールできない
https://bugs.ruby-lang.org/issues/7040#change-30132

Author: hsbt (Hiroshi SHIBATA)
Status: Open
Priority: Normal
Assignee: nagachika (Tomoyuki Chikanaga)
Category: ext
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-09-20 trunk 36993) [x86_64-darwin12.2.0]


trunk で特定の gem(例えば libv8等)をインストールしようとすると必ず失敗してしまいます。

 % gem i libv8
 ERROR:  While executing gem ... (Zlib::BufError)
     buffer error

Twitter 上で nagachika さんから Zlib の GVL 対応?が原因ではないかとコメントを頂きましたが、上記のエラー表示以降は調査しきれていません。



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next