ruby/ruby · error · Resolv::DNS::DecodeError
e.message
Error message
e.message
What it means
While decoding each resource record in a DNS message, Resolv::DNS::Message::MessageDecoder#get_rr calls the record type's decode_rdata inside begin/rescue and re-raises any failure as Resolv::DNS::DecodeError, preserving the original message and backtrace. The message you see is the underlying error text (bad lengths, malformed RDATA, broken SVCB params), so this error means a response contained an RR whose data does not parse.
Source
Thrown at lib/resolv.rb:1739
def get_label
return Label::Str.new(self.get_string)
end
def get_question
name = self.get_name
type, klass = self.get_unpack("nn")
return name, Resource.get_class(type, klass)
end
def get_rr
name = self.get_name
type, klass, ttl = self.get_unpack('nnN')
typeclass = Resource.get_class(type, klass)
res = self.get_length16 do
begin
typeclass.decode_rdata self
rescue => e
raise DecodeError, e.message, e.backtrace
end
end
res.instance_variable_set :@ttl, ttl
return name, ttl, res
end
end
end
##
# SvcParams for service binding RRs. [RFC9460]
class SvcParams
include Enumerable
##
# Create a list of SvcParams with the given initial content.
#
# +params+ has to be an enumerable of +SvcParam+s.View on GitHub (pinned to 0e5b888e1c)
Solutions
- Rescue Resolv::DNS::DecodeError wherever you call Resolv::DNS queries or Message.decode and treat the response as unusable
- Retry against a different nameserver; a single bad server should not break resolution
- Verify with dig against the same server to confirm the record is genuinely malformed
- If a specific RR type fails, upgrade Ruby — resolv decoder fixes (including SVCB/HTTPS params) land in patch releases
Example fix
# before
answer = Resolv::DNS::Message.decode(packet_bytes)
# => Resolv::DNS::DecodeError: received short packet / similar
# after
begin
answer = Resolv::DNS::Message.decode(packet_bytes)
rescue Resolv::DNS::DecodeError => e
warn "dropping malformed DNS response: #{e.message}"
answer = nil
end Defensive patterns
Strategy: try-catch
Try / catch
begin
message = Resolv::DNS::Message.decode(bytes)
rescue Resolv::DNS::DecodeError => e
# network-supplied data is untrusted; drop or flag the response
warn "malformed DNS response from peer: #{e.message}"
retry_with_next_nameserver
end Prevention
- Treat every DNS response as untrusted input; decode inside rescue DecodeError
- Keep a fallback nameserver so one corrupt responder cannot stall resolution
- Pin your Ruby version in CI and watch resolv changelogs when handling SVCB/HTTPS records
When it happens
Trigger: A resolver or middlebox returns corrupt or truncated RDATA (short A/AAAA records, malformed SVCB/HTTPS SvcParams); decoding raw captured DNS packets with Resolv::DNS::Message.decode; querying servers that answer with private/nonstandard record encodings; custom Resource classes whose decode_rdata is buggy.
Common situations: Security/monitoring tools decoding pcaps or passive DNS data; hitting broken or malicious resolvers; on-path devices mangling responses; testing custom RR implementations.
Related errors
- End of file reached
- #{t.inspect} is not numeric
- timeout=#{t} must be positive
- unexpected label: #{label.inspect}
- not a domain name: #{other.inspect}
AI-assisted analysis of ruby/ruby@0e5b888e1c (2026-08-21).
Data as JSON: /api/errors/9f79540438c322c9.
Report an issue: GitHub.