Skip to content

Commit 96dc3d1

Browse files
committed
Fix TCP Requester #recv_reply
1 parent 26a530c commit 96dc3d1

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

lib/resolv.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,8 +929,11 @@ def initialize(host, port=Port)
929929
end
930930

931931
def recv_reply(readable_socks)
932-
len = readable_socks[0].read(2).unpack('n')[0]
932+
len_data = readable_socks[0].read(2)
933+
raise Errno::ECONNRESET if len_data.nil?
934+
len = len_data.unpack('n')[0]
933935
reply = @socks[0].read(len)
936+
raise Errno::ECONNRESET if reply.nil?
934937
return reply, nil
935938
end
936939

test/resolv/test_dns.rb

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,4 +822,63 @@ def test_multiple_servers_with_timeout_and_truncated_tcp_fallback
822822
end
823823
end
824824
end
825+
826+
def test_tcp_connection_closed_before_length
827+
with_tcp('127.0.0.1', 0) do |t|
828+
_, server_port, _, server_address = t.addr
829+
830+
server_thread = Thread.new do
831+
ct = t.accept
832+
ct.recv(512)
833+
ct.close
834+
end
835+
836+
client_thread = Thread.new do
837+
requester = Resolv::DNS::Requester::TCP.new(server_address, server_port)
838+
begin
839+
msg = Resolv::DNS::Message.new
840+
msg.add_question('example.org', Resolv::DNS::Resource::IN::A)
841+
sender = requester.sender(msg, msg)
842+
assert_raise(Resolv::ResolvTimeout) do
843+
requester.request(sender, 2)
844+
end
845+
ensure
846+
requester.close
847+
end
848+
end
849+
850+
server_thread.join
851+
client_thread.join
852+
end
853+
end
854+
855+
def test_tcp_connection_closed_after_length
856+
with_tcp('127.0.0.1', 0) do |t|
857+
_, server_port, _, server_address = t.addr
858+
859+
server_thread = Thread.new do
860+
ct = t.accept
861+
ct.recv(512)
862+
ct.send([100].pack('n'), 0)
863+
ct.close
864+
end
865+
866+
client_thread = Thread.new do
867+
requester = Resolv::DNS::Requester::TCP.new(server_address, server_port)
868+
begin
869+
msg = Resolv::DNS::Message.new
870+
msg.add_question('example.org', Resolv::DNS::Resource::IN::A)
871+
sender = requester.sender(msg, msg)
872+
assert_raise(Resolv::ResolvTimeout) do
873+
requester.request(sender, 2)
874+
end
875+
ensure
876+
requester.close
877+
end
878+
end
879+
880+
server_thread.join
881+
client_thread.join
882+
end
883+
end
825884
end

0 commit comments

Comments
 (0)