summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-07 15:03:34 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-07 15:03:34 +0000
commit688606d2d973584f6fe99379b1bee27caae159d8 (patch)
tree5bf2e36b6f426ceaf6e390158719cfb0bad34e80 /lib
parentda48c18c8142a9a096859f3fa4beb1c004ca8610 (diff)
* lib/resolv.rb: Ignore name servers which cause EAFNOSUPPORT on
socket creation. Reported by Bjoern Rennhak. [ruby-core:60442] [Bug #9477] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44880 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/resolv.rb16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/resolv.rb b/lib/resolv.rb
index 3194d76aa1..579f8885ae 100644
--- a/lib/resolv.rb
+++ b/lib/resolv.rb
@@ -522,8 +522,9 @@ class Resolv
msg.rd = 1
msg.add_question(candidate, typeclass)
unless sender = senders[[candidate, nameserver, port]]
- sender = senders[[candidate, nameserver, port]] =
- requester.sender(msg, candidate, nameserver, port)
+ sender = requester.sender(msg, candidate, nameserver, port)
+ next if !sender
+ senders[[candidate, nameserver, port]] = sender
end
reply, reply_name = requester.request(sender, tout)
case reply.rcode
@@ -741,7 +742,11 @@ class Resolv
af = Socket::AF_INET
end
next if @socks_hash[bind_host]
- sock = UDPSocket.new(af)
+ begin
+ sock = UDPSocket.new(af)
+ rescue Errno::EAFNOSUPPORT
+ next # The kernel doesn't support the address family.
+ end
sock.do_not_reverse_lookup = true
sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
DNS.bind_random_port(sock, bind_host)
@@ -756,11 +761,12 @@ class Resolv
end
def sender(msg, data, host, port=Port)
+ sock = @socks_hash[host.index(':') ? "::" : "0.0.0.0"]
+ return nil if !sock
service = [host, port]
id = DNS.allocate_request_id(host, port)
request = msg.encode
request[0,2] = [id].pack('n')
- sock = @socks_hash[host.index(':') ? "::" : "0.0.0.0"]
return @senders[[service, id]] =
Sender.new(request, data, sock, host, port)
end
@@ -781,6 +787,7 @@ class Resolv
attr_reader :data
def send
+ raise "@sock is nil." if @sock.nil?
@sock.send(@msg, 0, @host, @port)
end
end
@@ -824,6 +831,7 @@ class Resolv
class Sender < Requester::Sender # :nodoc:
def send
+ raise "@sock is nil." if @sock.nil?
@sock.send(@msg, 0)
end
attr_reader :data