Forum: Ruby-dev [ruby-trunk - Bug #8054][Open] open-uri と resolv-replace を同時にロードすると壊れる

Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-09 07:37
(Received via mailing list)
Issue #8054 has been reported by mrkn (Kenta Murata).

----------------------------------------
Bug #8054: open-uri と resolv-replace を同時にロードすると壊れる
https://bugs.ruby-lang.org/issues/8054

Author: mrkn (Kenta Murata)
Status: Open
Priority: Normal
Assignee: akr (Akira Tanaka)
Category: lib
Target version:
ruby -v: ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]


以下のように、open-uri と resolv-replace を同時にロードすると壊れます。

$ ruby -ropen-uri -rresolv-replace -ve 
'open("http://www.ruby-lang.org/")'
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1176:in 
`create': cannot interpret as DNS name: nil (ArgumentError)
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1022:in 
`generate_candidates'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1047:in 
`resolv'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:513:in 
`each_resource'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:406:in 
`each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:115:in 
`block in each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:114:in 
`each'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:114:in 
`each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:92:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:43:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv-replace.rb:10:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv-replace.rb:22:in 
`initialize'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in 
`open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in 
`block in connect'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/timeout.rb:51:in 
`timeout'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:876:in 
`connect'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:861:in 
`do_start'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:850:in 
`start'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:313:in 
`open_http'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:708:in 
`buffer_open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:210:in 
`block in open_loop'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:208:in 
`catch'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:208:in 
`open_loop'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:149:in 
`open_uri'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:688:in 
`open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:34:in 
`open'
  from -e:1:in `<main>'
Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-11 02:04
(Received via mailing list)
Issue #8054 has been updated by mrkn (Kenta Murata).


以下のような修正で正しく動いてるようです:

diff --git a/lib/resolv-replace.rb b/lib/resolv-replace.rb
index ff34f90..374c81a 100644
--- a/lib/resolv-replace.rb
+++ b/lib/resolv-replace.rb
@@ -18,9 +18,9 @@ class TCPSocket < IPSocket
   # :stopdoc:
   alias original_resolv_initialize initialize
   # :startdoc:
-  def initialize(host, serv, *rest)
-    rest[0] = IPSocket.getaddress(rest[0]) unless rest.empty?
-    original_resolv_initialize(IPSocket.getaddress(host), serv, *rest)
+  def initialize(host, serv, local_host=nil, local_serv=nil)
+    local_host = IPSocket.getaddress(local_host) if local_host
+    original_resolv_initialize(IPSocket.getaddress(host), serv, 
local_host, local_serv)
   end
 end

----------------------------------------
Bug #8054: open-uri と resolv-replace を同時にロードすると壊れる
https://bugs.ruby-lang.org/issues/8054#change-37478

Author: mrkn (Kenta Murata)
Status: Open
Priority: Normal
Assignee: akr (Akira Tanaka)
Category: lib
Target version:
ruby -v: ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]


以下のように、open-uri と resolv-replace を同時にロードすると壊れます。

$ ruby -ropen-uri -rresolv-replace -ve 
'open("http://www.ruby-lang.org/")'
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1176:in 
`create': cannot interpret as DNS name: nil (ArgumentError)
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1022:in 
`generate_candidates'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1047:in 
`resolv'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:513:in 
`each_resource'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:406:in 
`each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:115:in 
`block in each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:114:in 
`each'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:114:in 
`each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:92:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:43:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv-replace.rb:10:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv-replace.rb:22:in 
`initialize'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in 
`open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in 
`block in connect'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/timeout.rb:51:in 
`timeout'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:876:in 
`connect'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:861:in 
`do_start'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:850:in 
`start'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:313:in 
`open_http'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:708:in 
`buffer_open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:210:in 
`block in open_loop'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:208:in 
`catch'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:208:in 
`open_loop'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:149:in 
`open_uri'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:688:in 
`open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:34:in 
`open'
  from -e:1:in `<main>'
Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-11 06:07
(Received via mailing list)
Issue #8054 has been updated by mrkn (Kenta Murata).


この問題が起きるようになったのは r36367 の変更からだと思います。
r36367 より、Net::HTTP#connect で、TCPSocket.open の第3引数と第4引数が
必ず明示的に渡されるようになりました。
この変更に対して resolv-replace.rb が追従していません。
resolv-replace のテスト無かったから気づかなかったんでしょうね。
----------------------------------------
Bug #8054: open-uri と resolv-replace を同時にロードすると壊れる
https://bugs.ruby-lang.org/issues/8054#change-37496

Author: mrkn (Kenta Murata)
Status: Open
Priority: Normal
Assignee: akr (Akira Tanaka)
Category: lib
Target version:
ruby -v: ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]


以下のように、open-uri と resolv-replace を同時にロードすると壊れます。

$ ruby -ropen-uri -rresolv-replace -ve 
'open("http://www.ruby-lang.org/")'
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1176:in 
`create': cannot interpret as DNS name: nil (ArgumentError)
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1022:in 
`generate_candidates'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:1047:in 
`resolv'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:513:in 
`each_resource'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:406:in 
`each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:115:in 
`block in each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:114:in 
`each'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:114:in 
`each_address'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:92:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv.rb:43:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv-replace.rb:10:in 
`getaddress'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/resolv-replace.rb:22:in 
`initialize'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in 
`open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in 
`block in connect'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/timeout.rb:51:in 
`timeout'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:876:in 
`connect'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:861:in 
`do_start'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:850:in 
`start'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:313:in 
`open_http'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:708:in 
`buffer_open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:210:in 
`block in open_loop'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:208:in 
`catch'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:208:in 
`open_loop'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:149:in 
`open_uri'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:688:in 
`open'
  from 
/Users/kenta-murata/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open-uri.rb:34:in 
`open'
  from -e:1:in `<main>'
Posted by Tanaka Akira (Guest)
on 2013-03-11 14:48
(Received via mailing list)
2013/3/11 mrkn (Kenta Murata) <muraken@gmail.com>:
> @@ -18,9 +18,9 @@ class TCPSocket < IPSocket
>  end
$B0z?t$N?t$rJQ$($k$N$b$J$s$J$N$G!"(Br39725 $B$H$$$&46$8$G!#(B
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.