diff --git a/ChangeLog b/ChangeLog index 99bcc96393..24c5adf667 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Feb 8 16:34:36 2014 Tanaka Akira + + * lib/resolv.rb (Resolv::DNS::Message::MessageDecoder#get_labels): + Make it iterative. + Sat Feb 8 15:54:12 2014 Koichi Sasada * gc.c, gc.h (rb_objspace_marked_object_p): added. diff --git a/lib/resolv.rb b/lib/resolv.rb index 0421da4377..2789aa1c12 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -1572,30 +1572,33 @@ class Resolv return Name.new(self.get_labels) end - def get_labels(limit=nil) - limit = @index if !limit || @index < limit + def get_labels + prev_index = @index + save_index = nil d = [] while true raise DecodeError.new("limit exceeded") if @limit <= @index case @data[@index].ord when 0 @index += 1 + if save_index + @index = save_index + end return d when 192..255 idx = self.get_unpack('n')[0] & 0x3fff - if limit <= idx + if prev_index <= idx raise DecodeError.new("non-backward name pointer") end - save_index = @index + prev_index = idx + if !save_index + save_index = @index + end @index = idx - d += self.get_labels(limit) - @index = save_index - return d else d << self.get_label end end - return d end def get_label