resolv icon indicating copy to clipboard operation
resolv copied to clipboard

Fix TCP Requester #recv_reply

Open jsaubry opened this issue 2 months ago • 1 comments

I've been seeing some intermittent NoMethodError undefined method 'unpack' for nil exceptions raised from Resolv.

NoMethodError undefined method 'unpack' for nil
/ruby/3.4.0/resolv.rb:931 Resolv::DNS::Requester::TCP#recv_reply
/ruby/3.4.0/resolv.rb:720 Resolv::DNS::Requester#request
/ruby/3.4.0/resolv.rb:558 block in Resolv::DNS#fetch_resource
/ruby/3.4.0/resolv.rb:1168 block (3 levels) in Resolv::DNS::Config#resolv
/ruby/3.4.0/resolv.rb:1166 Array#each
/ruby/3.4.0/resolv.rb:1166 block (2 levels) in Resolv::DNS::Config#resolv
/ruby/3.4.0/resolv.rb:1165 Array#each
/ruby/3.4.0/resolv.rb:1165 block in Resolv::DNS::Config#resolv
/ruby/3.4.0/resolv.rb:1163 Array#each
/ruby/3.4.0/resolv.rb:1163 Resolv::DNS::Config#resolv
/ruby/3.4.0/resolv.rb:540 Resolv::DNS#fetch_resource
/ruby/3.4.0/resolv.rb:523 Resolv::DNS#each_resource
/ruby/3.4.0/resolv.rb:514 Resolv::DNS#getresources

This seems to have been caused by misbehaving DNS servers closing connections before answering. The fix is to simply make sure we were able to read data from the server before trying to interpret it.

The raised Errno::ECONNRESET will be caught by the calling #request method and re-raised as ResolvTimeout.

jsaubry avatar Oct 29 '25 13:10 jsaubry

@hsbt I would love to get a review on this

jsaubry avatar Nov 17 '25 12:11 jsaubry