Bug #7183

Resolv::DNS::getresources throws Errno::EACCES: Permission denied - bind(2) on solaris

Added by Frank Meier over 1 year ago. Updated about 1 year ago.

[ruby-core:48064]
Status:Closed
Priority:Normal
Assignee:Akira Tanaka
Category:-
Target version:next minor
ruby -v:ruby 1.9.2p180 (2011-02-18 revision 30909) [i386-solaris2.10] Backport:

Description

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 bindrandomport(), 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

Associated revisions

Revision 40112
Added by Akira Tanaka about 1 year ago

  • lib/resolv.rb (bindrandomport): Rescue EACCES for SunOS. bind() on SunOS for port 2049 (nfs) and 4045 (lockd) causes EACCES with unprivileged process. cf. PRIVSYSNFS in privileges(5) [Bug #7183] reported by Frank Meier.

History

#1 Updated by Yusuke Endoh over 1 year ago

  • Status changed from Open to Assigned
  • Assignee set to Akira Tanaka
  • Target version changed from 1.9.3 to 2.0.0

Akr-san, could you check this?

Yusuke Endoh mame@tsg.ne.jp

#2 Updated by Yusuke Endoh about 1 year ago

  • Target version changed from 2.0.0 to next minor

#3 Updated by Akira Tanaka about 1 year ago

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

This issue was solved with changeset r40112.
Frank, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/resolv.rb (bindrandomport): Rescue EACCES for SunOS. bind() on SunOS for port 2049 (nfs) and 4045 (lockd) causes EACCES with unprivileged process. cf. PRIVSYSNFS in privileges(5) [Bug #7183] reported by Frank Meier.

Also available in: Atom PDF