summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-08 07:35:24 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-08 07:35:24 +0000
commitf01b5e217b2a4865f2af6e680181e362ee3f4480 (patch)
treeb1de5d1133fe633c167e036e30dbe4c7088604fa /lib
parentc6f2c9383f446f92e482a6e1c7e13772affde8d7 (diff)
* lib/resolv.rb (Resolv::DNS::Message::MessageDecoder#get_labels):
Make it iterative. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44887 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/resolv.rb19
1 files changed, 11 insertions, 8 deletions
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