Bug #10747
closedDNS resolution should fall back to TCP on Errno::EACCES
Description
On some platforms, users may be restricted from global binding to a UDP port, which is necessary for UDP-based DNS lookups. In this case, an exception like the following is currently raised:
ruby -r resolv -e 'puts Resolv.getaddress "www.ruby-lang.org"'
resolv.rb:655:inbind': Permission denied - bind(2) (Errno::EACCES) resolv.rb:655:in
bind_random_port'
resolv.rb:791:ininitialize' resolv.rb:560:in
new'
resolv.rb:560:inmake_udp_requester' resolv.rb:513:in
each_resource'
resolv.rb:406:ineach_address' resolv.rb:115:in
block in each_address'
resolv.rb:114:ineach' resolv.rb:114:in
each_address'
resolv.rb:92:ingetaddress' resolv.rb:43:in
getaddress'
This error should be caught, and the resolver should fall back to TCP, as it does in other cases where this is necessary. A possible patch for this (written against 2.0.0p353 in RHEL) is attached.
Ideally, it would also be nice to be able to specify tcp by default when initializing a DNS object on such platforms, to avoid repeated bind attempts which are known to fail, but I am not sure of the best way to introduce such an option.
Files