Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

getresources returns nothing for types created with Generic.create since 0.7.2

Abierto Apto para principiantes
#151 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
86/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
ruby
Área
networking

Línea de trabajo

Comienza ejecutando la reproducción suministrada sin red e inspecciona DNS#extract_resources, especialmente ambas ramas que seleccionan respuestas según la typeclass. Verifica que getresources devuelva el registro Generic decodificado, mientras que los registros nombrados IN::A e IN::AAAA conserven su comportamiento existente.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Since 0.7.2, getresources and each_resource never return records for a type created with Resolv::DNS::Resource::Generic.create, for example NAPTR (type 35), which has no named class in Resolv.

Cause

fa5e689c4 ("Do not register on-demand classes for unknown DNS types and SvcParamKeys") stopped registering the classes from Generic.create. So decoding a reply gives each unknown record a new anonymous class, not the class the caller passed. 05185b432 and fcff0a19e updated Message#== and Generic#== for this with Generic.type_class_equal?. DNS#extract_resources still selects answers with when typeclass, so it drops every decoded record of such a type.

Reproduction

This needs no network: it encodes and decodes a reply and gives it to getresources.

require "resolv"

naptr = Resolv::DNS::Resource::Generic.create(35, Resolv::DNS::Resource::IN::ClassValue)
name = "example.com."
rdata = "\x00\x64\x00\x0A\x01U\x07E2U+sip\x1C!^.*$!sip:[email protected]!\x00".b

reply = Resolv::DNS::Message.new
reply.add_answer(name, 60, naptr.new(rdata))
decoded = Resolv::DNS::Message.decode(reply.encode)

dns = Resolv::DNS.new
dns.define_singleton_method(:fetch_resource) {|_name, _typeclass, &block| block.call(decoded, Resolv::DNS::Name.create(name)) }

puts "resolv #{Resolv::VERSION}: #{dns.getresources(name, naptr).size} record(s)"
resolv 0.7.0: 1 record(s)
resolv 0.7.2: 0 record(s)
resolv 0.8.0: 0 record(s)

A real query shows the same result: getresources returns [], but fetch_resource gets the NAPTR answer. Ruby 4.0.7 includes 0.7.2, so a patch update of Ruby is enough to get this behaviour.

Possible fix

Compare by type and class value in extract_resources, in both when typeclass branches:

-          when typeclass
+          when ->(data) { Resource::Generic.type_class_equal?(data.class, typeclass) }

With this change, the reproduction returns 1 record on 0.8.0. Named types (IN::A, IN::AAAA) behave as before, because type_class_equal? compares identity first and returns false for classes that are not Generic.

Workaround

Register the type in the same way as Resolv's built-in types:

class NAPTR < Resolv::DNS::Resource::Generic
  const_set(:TypeValue, 35)
  const_set(:ClassValue, Resolv::DNS::Resource::IN::ClassValue)
  Resolv::DNS::Resource::ClassHash[[self::TypeValue, self::ClassValue]] = self
end
Lenguaje dominante
Ruby
Estrellas
56
Forks
41
Merge medio
2 h 50 min
PR fusionados (30 d)
8

Preparar el entorno

Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de ruby/resolv

Todos los issues de ruby/resolv

Issues similares

Más issues de Ruby

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.