Skip to content

Commit 24ed513

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 22153c2 commit 24ed513

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
@@ -1655,6 +1655,7 @@ def get_labels
16551655
prev_index = @index
16561656
save_index = nil
16571657
d = []
1658+
size = -1
16581659
while true
16591660
raise DecodeError.new("limit exceeded") if @limit <= @index
16601661
case @data.getbyte(@index)
@@ -1675,7 +1676,10 @@ def get_labels
16751676
end
16761677
@index = idx
16771678
else
1678-
d << self.get_label
1679+
l = self.get_label
1680+
d << l
1681+
size += 1 + l.string.bytesize
1682+
raise DecodeError.new("name label data exceed 255 octets") if size > 255
16791683
end
16801684
end
16811685
end

test/resolv/test_dns.rb

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

592+
def test_too_long_address
593+
too_long_address_message = [0, 0, 1, 0, 0, 0].pack("n*") + "\x01x" * 129 + [0, 0, 0].pack("cnn")
594+
assert_raise_with_message(Resolv::DNS::DecodeError, /name label data exceed 255 octets/) do
595+
Resolv::DNS::Message.decode too_long_address_message
596+
end
597+
end
598+
592599
def assert_no_fd_leak
593600
socket = assert_throw(self) do |tag|
594601
Resolv::DNS.stub(:bind_random_port, ->(s, *) {throw(tag, s)}) do

0 commit comments

Comments
 (0)