Skip to content

Commit 29552d7

Browse files
committed
Improved handling of exceptions during Resolver message decode (fixes socketry#10).
1 parent c88ea9e commit 29552d7

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

lib/rubydns/message.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def self.decode_message(data)
3535
data.force_encoding("BINARY")
3636
end
3737

38+
# This may throw Resolv::DNS::DecodeError.
3839
Message.decode(data)
3940
end
4041
end

lib/rubydns/resolver.rb

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,22 @@ def run!
111111
end
112112

113113
def process_response!(response)
114-
if response.tc != 0
114+
if Exception === response
115+
@logger.warn "[#{@message.id}] Failure while processing response #{exception}!" if @logger
116+
RubyDNS.log_exception(@logger, response) if @logger
117+
118+
try_next_server!
119+
elsif response.tc != 0
115120
@logger.warn "[#{@message.id}] Received truncated response!" if @logger
116-
# We hardcode this behaviour for now.
121+
122+
try_next_server!
123+
elsif response.id != @message.id
124+
@logger.warn "[#{@message.id}] Received response with incorrect message id: #{response.id}" if @request.logger
125+
117126
try_next_server!
118127
else
119128
@logger.warn "[#{@message.id}] Received valid response #{response.inspect}" if @logger
129+
120130
succeed response
121131
end
122132
end
@@ -175,13 +185,11 @@ def post_init
175185
def receive_data(data)
176186
# Receiving response from remote DNS server...
177187
message = RubyDNS::decode_message(data)
178-
188+
179189
# The message id must match, and it can't be truncated:
180-
if message.id == @request.message.id
181-
@request.process_response!(message)
182-
else
183-
@request.logger.warn "[#{@request.message.id}] Received response with incorrect message id: #{message.id}" if @request.logger
184-
end
190+
@request.process_response!(message)
191+
rescue Resolv::DNS::DecodeError => error
192+
@request.process_response!(error)
185193
end
186194
end
187195

@@ -220,12 +228,10 @@ def receive_data(data)
220228

221229
message = RubyDNS::decode_message(data)
222230

223-
if message.id == @request.message.id
224-
@request.process_response!(message)
225-
else
226-
@request.logger.warn "[#{@request.message.id}] Received response with incorrect message id: #{message.id}" if @request.logger
227-
end
231+
@request.process_response!(message)
228232
end
233+
rescue Resolv::DNS::DecodeError => error
234+
@request.process_response!(error)
229235
end
230236
end
231237
end

0 commit comments

Comments
 (0)