Issue #10747 has been reported by Andy Grimm.

----------------------------------------
Bug #10747: DNS resolution should fall back to TCP on Errno::EACCES
https://bugs.ruby-lang.org/issues/10747

* Author: Andy Grimm
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: 2.0.0p353
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
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:in `bind': Permission denied - bind(2) (Errno::EACCES)
	resolv.rb:655:in `bind_random_port'
	resolv.rb:791:in `initialize'
	resolv.rb:560:in `new'
	resolv.rb:560:in `make_udp_requester'
	resolv.rb:513:in `each_resource'
	resolv.rb:406:in `each_address'
	resolv.rb:115:in `block in each_address'
	resolv.rb:114:in `each'
	resolv.rb:114:in `each_address'
	resolv.rb:92:in `getaddress'
	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--------------------------------
resolver-force-tcp.patch (830 Bytes)


-- 
https://bugs.ruby-lang.org/