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

  1. Rescue Resolv::DNS::DecodeError wherever you call Resolv::DNS queries or Message.decode and treat the response as unusable
  2. Retry against a different nameserver; a single bad server should not break resolution
  3. Verify with dig against the same server to confirm the record is genuinely malformed
  4. 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

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


AI-assisted analysis of ruby/ruby@0e5b888e1c (2026-08-21). Data as JSON: /api/errors/9f79540438c322c9. Report an issue: GitHub.