From: "frank_meier (Frank Meier)" <frank.meier@...>
Date: 2012-10-18T21:47:27+09:00
Subject: [ruby-core:48064] [ruby-trunk - Bug #7183][Open] Resolv::DNS::getresources throws Errno::EACCES: Permission denied - bind(2) on solaris


Issue #7183 has been reported by frank_meier (Frank Meier).

----------------------------------------
Bug #7183: Resolv::DNS::getresources throws Errno::EACCES: Permission denied - bind(2) on solaris
https://bugs.ruby-lang.org/issues/7183

Author: frank_meier (Frank Meier)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 1.9.3
ruby -v: ruby 1.9.2p180 (2011-02-18 revision 30909) [i386-solaris2.10]


we have ruby running on Solaris. sometimes one of our tools fails with exception Errno::EACCES while calling Resolv::DNS::getresources. This only happens one out of thousands of times the tool is used. 
After looking into lib/resolv.rb I saw, there is an optimistic loop in bind_random_port(), which looks to me it is thought of the possibility that a unusable port is selected (one that is used by another process), and if that happens it is tried again. Unfortunately it is only done when the exception is Errno::EADDRINUSE, what might be correct in Linux, but not Solaris (Sol10u6).

I propose to add Errno::EACCESS to the raise statement. Maybe a retry count limit as well:

    def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
      begin
        count += 1
        port = rangerand(1024..65535)
        udpsock.bind(bind_host, port)
      rescue Errno::EADDRINUSE, Errno::EACCESS => e
        if count < 10
          retry
        else
          raise e
        end
      end
    end



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