From: Tanaka Akira Date: 2004-11-05T08:21:07+09:00 Subject: [ruby-dev:24714] Re: String#gsub causes core dump In article <1099604103.050658.11406.nullmailer@x31.priv.netlab.jp>, Yukihiro Matsumoto writes: > 夕べ、String#gsubはレシーバをlocktmpしなくなりましたから、こ > の問題はなくなりました。ただ、gsubでなくreadでは同じ問題が起 > こせますね。 夕べというのが [ruby-cvs:13090] であるとすれば、rb_str_locktmp(str) は 消えているのですが、rb_str_unlocktmp(str) は消えていないのでこの問題は 残っているように思います。それとも、そちらではまだ commit されていない だけで rb_str_unlocktmp(str) も消えているのでしょうか? また、read では、rb_str_modify(str) にひっかかるため、同じ問題が起こせ るという程には似ていないように思います。 % echo | ./ruby -d -rsocket -e ' s = TCPSocket.open("www.ruby-lang.org", 80) s.print "GET / HTTP/1.0\r\n\r\n" Thread.new { Thread.pass; ObjectSpace.each_object(String) {|s| if s.length == 0x10000 STDIN.read(1, s) s.replace "a" end } } p s.recvfrom(0x10000)' Exception `RuntimeError' at -e:7 - can't modify string; temporarily locked -e:7:in `read': can't modify string; temporarily locked (RuntimeError) from -e:7 from -e:5:in `each_object' from -e:5 from -e:4:in `initialize' from -e:4:in `new' from -e:4 -- [田中 哲][たなか あきら][Tanaka Akira]