From: Shyouhei Urabe Date: 2011-05-25T14:15:01+09:00 Subject: [ruby-dev:43579] [Backport87 - Backport #4230][Closed] PlatformSDKのヘッダでビルドするとSocket::getaddrinfoで例外 Issue #4230 has been updated by Shyouhei Urabe. Status changed from Assigned to Closed バックポートしました。 ---------------------------------------- Backport #4230: PlatformSDKのヘッダでビルドするとSocket::getaddrinfoで例外 http://redmine.ruby-lang.org/issues/4230 Author: Masahiro Kitajima Status: Closed Priority: Normal Assignee: Shyouhei Urabe Category: Target version: ruby -v: ruby -v:ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32] =begin  以前からVC++6.0対応の最後の Platform SDK である「Microsoft Platform SDK February 2003」を使ってビルドしていました。  ruby-1.8.7-p330から ext/socket/extconf.rb が変わった事で、getaddrinfo()、getnameinfo() に、エミュレーション・コード(getaddrinfo.c、getnameinfo.c)の代わりに Windows API が使われるようになりました。  これにより、以下のコードの address に nil や "localhost" を与えた時に例外が上がるようになりました。 ---- ここから ---- require 'socket' port = 80 address = "localhost" p Socket::getaddrinfo(address, port, Socket::AF_UNSPEC, # address family Socket::SOCK_STREAM, # socket type 0, # protocol Socket::AI_PASSIVE) # flag #=> test.rb:4:in `getaddrinfo': getnameinfo: 呼び出しでポインタ引数を使用するときに、無効なポインタ アドレスを検出しました。 (SocketError) from test.rb:4 # ruby-1.8.7-p302 => [["AF_INET", 80, "localhost", "127.0.0.1", 2, 1, 6]] ---- ここまで ----  このテスト・コードは WEBrick::Utils#create_listeners に書かれているものです。WEBrick 利用のアプリケーション(gem server など)が動かなくなって気付きました。  なお、VC++6.0 のヘッダでビルドした時は getaddrinfo.c、getnameinfo.c が使われるため、上記現象は起きません。  ext/socket/extconf.rb を以下のようにすると、Platform SDK のヘッダでビルドした時の getnameinfo() API 呼び出しの矛盾がなくなり、上記現象が解消します。また結果として IPv6 対応になります。  また VC++6.0 のヘッダでビルドした時は、従来どおり getaddrinfo.c、getnameinfo.c が使われます。 ---- ここから ---- --- extconf.rb.org Wed Nov 24 18:37:06 2010 +++ extconf.rb Tue Jan 04 20:27:24 2011 @@ -43,4 +43,5 @@ if checking_for("ipv6") {try_link(< -#include +#{(RUBY_PLATFORM =~ /mswin32/) ? + "#include \n#include " : + "#include \n#include "} int @@ -48,2 +49,3 @@ { + struct in6_addr dummy; socket(AF_INET6, SOCK_STREAM, 0); ---- ここまで ---- =end -- http://redmine.ruby-lang.org