Skip to content

Commit 4c2f71b

Browse files
mamehsbt
authored andcommitted
Limit decompressed name length
RFC 1035 specifies the 255-octet maximum name length. This change set checks the limit.
1 parent c1031bf commit 4c2f71b

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

lib/resolv.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1679,6 +1679,7 @@ def get_labels
16791679
prev_index = @index
16801680
save_index = nil
16811681
d = []
1682+
size = -1
16821683
while true
16831684
raise DecodeError.new("limit exceeded") if @limit <= @index
16841685
case @data.getbyte(@index)
@@ -1699,7 +1700,10 @@ def get_labels
16991700
end
17001701
@index = idx
17011702
else
1702-
d << self.get_label
1703+
l = self.get_label
1704+
d << l
1705+
size += 1 + l.string.bytesize
1706+
raise DecodeError.new("name label data exceed 255 octets") if size > 255
17031707
end
17041708
end
17051709
end

test/resolv/test_dns.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,13 @@ def test_too_big_label_address
627627
assert_operator(2**14, :<, m.to_s.length)
628628
end
629629

630+
def test_too_long_address
631+
too_long_address_message = [0, 0, 1, 0, 0, 0].pack("n*") + "\x01x" * 129 + [0, 0, 0].pack("cnn")
632+
assert_raise_with_message(Resolv::DNS::DecodeError, /name label data exceed 255 octets/) do
633+
Resolv::DNS::Message.decode too_long_address_message
634+
end
635+
end
636+
630637
def assert_no_fd_leak
631638
socket = assert_throw(self) do |tag|
632639
Resolv::DNS.stub(:bind_random_port, ->(s, *) {throw(tag, s)}) do

0 commit comments

Comments
 (0)