Project

General

Profile

Backport #4230

PlatformSDKのヘッダでビルドするとSocket::getaddrinfoで例外

Added by katonbo (Masahiro Kitajima) over 8 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
[ruby-dev:42944]

Description

=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

Associated revisions

Revision 31660
Added by shyouhei (Shyouhei Urabe) over 8 years ago

merge revision(s) 30457:
?\012
* ext/socket/socket.c (make_addrinfo): skip IPv6 addresses when ruby
doesn't support IPv6 but system supports it.
ruby-dev:42944

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@30457 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Signed-off-by: URABE, Shyouhei shyouhei@ruby-lang.org

History

#1

Updated by usa (Usaku NAKAMURA) over 8 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r30457.
Masahiro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

#2

Updated by usa (Usaku NAKAMURA) over 8 years ago

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

In message "[ruby-dev:42955] [Ruby 1.8-Bug#4230][Closed] PlatformSDKのヘッダでビルドするとSocket::getaddrinfoで例外"
on Jan.05,2011 19:17:06, redmine@ruby-lang.org wrote:

This issue was solved with changeset r30457.

とりあえず問題を元から絶ちました。
IPv6サポートが壊れてるのはまた別途。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#3

Updated by shyouhei (Shyouhei Urabe) over 8 years ago

  • Status changed from Closed to Feedback
  • Assignee set to usa (Usaku NAKAMURA)

=begin
んー、これはバックポートすべきなんでしょうか?

多分そうなんだとは思うものの。もうちょっとまてとかあれば教えてください。
=end

#4

Updated by usa (Usaku NAKAMURA) over 8 years ago

=begin
要ると思います。
続きはいつ出すかわからないので待たなくていいです。
=end

#5

Updated by usa (Usaku NAKAMURA) over 8 years ago

  • Status changed from Feedback to Assigned
  • Assignee changed from usa (Usaku NAKAMURA) to shyouhei (Shyouhei Urabe)

=begin

=end

Updated by shyouhei (Shyouhei Urabe) over 8 years ago

  • Status changed from Assigned to Closed

バックポートしました。

Also available in: Atom PDF