ruby-zlib
http://www.blue.sky.or.jp/atelier/
  を利用させていただいて2チャンネルブラウザ
http://www.unixuser.org/%7Eharuyama/software/goRua/
  を作っている春山と申します.

  このブラウザでgzip圧縮されたファイルを
  改行区切りで読みこむ処理をしているのですが
  行が長い場合にSegmentation faultをすることがあります.

  その部分を抜きだしたスクリプトでも現象が再現したので,
  報告します.

----------
当方の環境

Linux 2.4.16
% ruby -v
ruby 1.6.6 (2001-12-13) [i686-linux]
# 12/17に取得した安定版snapshot
ruby-zlib 0.4.0

ruby 1.6.4,1.6.5リリースでもブラウザがSegmentation faultする
場合があることを確認していますが,現象の確認はしていません.
----------
テストスクリプト(末尾にも掲載)
http://www.unixuser.org/%7Eharuyama/tmp/test.rb
引数として与えるファイル(gzip圧縮されています,http://pc.2ch.net/test/read.cgi/sec/1000226553/)
http://www.unixuser.org/%7Eharuyama/tmp/pc.2ch.net_80__test_read.cgi_sec_1000226553_

Segmentation fault を起こしていると思われる行
「名無しさん@お腹いっぱい。<><>01/09/21 15:49」
で始まる(長い)行 (スレッドでの189番目の発言)
----------
実行結果

./test.rb:16: [BUG] Segmentation fault
ruby 1.6.6 (2001-12-13) [i686-linux]
アボート (coreを出力しました)
----------
backtrace

#0  0x400f20ac in chunk_realloc (ar_ptr=0x401985e0, oldp=0x8186768, 
    oldsize=5288, nb=8552) at malloc.c:3326
#1  0x400f2013 in __libc_realloc (oldmem=0x8186770, bytes=8548)
    at malloc.c:3286
#2  0x08067073 in ruby_xrealloc (ptr=0x8186770, size=8548) at gc.c:137
#3  0x080a1d2a in rb_str_resize (str=1075567748, len=8547) at string.c:422
#4  0x40020f96 in zstream_expand_buffer () at eval.c:88
#5  0x400213c8 in zstream_run_internal () at eval.c:88
#6  0x400214a2 in zstream_run () at eval.c:88
#7  0x40022bfb in gzipreader_inflate () at eval.c:88
#8  0x40023dd3 in gzipreader_read_data () at eval.c:88
#9  0x4002452f in gzipreader_gets () at eval.c:88
#10 0x400245e3 in rb_gzipreader_gets () at eval.c:88
#11 0x08059a29 in call_cfunc (func=0x400245c0 <rb_gzipreader_gets>, 
    recv=1075580508, len=-1, argc=0, argv=0x0) at eval.c:4228
#12 0x08059f42 in rb_call0 (klass=1075580288, recv=1075580508, id=6769, 
    argc=0, argv=0x0, body=0x401beb34, nosuper=1) at eval.c:4365
#13 0x0805a752 in rb_call (klass=1075580288, recv=1075580508, mid=6769, 
    argc=0, argv=0x0, scope=0) at eval.c:4585
.....
----------
調査

  関数zstream_expand_buffer(struct zstream *z) での
                inc = z->buf_filled / 2;
                if (inc < ZSTREAM_AVAIL_OUT_MIN)
                        inc = ZSTREAM_AVAIL_OUT_MIN;
                rb_str_resize(z->buf, z->buf_filled + inc);
  によりSegmentation faultしているので
  incの値を増やしたらどうなるかなと考え
#define ZSTREAM_AVAIL_OUT_MIN    1024
  を
#define ZSTREAM_AVAIL_OUT_MIN    8192
  とすると テストスクリプトでも
  ブラウザで該当スレッドを表示してもSegmentation faultしなくなりました.

  4096ではテストスクリプトでは問題なかったがブラウザでは
  Segmentation faultしました.

  根本的な解決とは思えませんが.
---------------
test.rb

#!/usr/bin/ruby -Ke
require 'kconv'
require 'zlib'


file=Zlib::GzipReader.new($<)
while line=file.gets
  line=Kconv::kconv(line,Kconv::EUC,Kconv::SJIS)
  line.strip!
#  p line
  if /^(?:\+OK|-INCR)\s+(\d+)/ =~ line
    next
  end
  (name,mailto,date_id,body,title)=line.split(/<>/)
  lines  = body.split("<br>")
  lines.each { |tmp_line|
#    p tmp_line
  }
end

-- 

  春山 征吾 / HARUYAMA Seigo  haruyama / unixuser.org  haruyama / queen-ml.org