summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJean-Samuel Aubry-Guzzi <js.aubry@shopify.com>2025-12-08 11:22:55 -0500
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-12-26 11:00:51 +0900
commitf8d0960af260219ab7c10a797ac62ecad25b2974 (patch)
treeaf8bea18029cd03435db15f3d7281b8f12251c68 /test
parent4b7bbd43408f230997e216a557d586edd492172d (diff)
[ruby/resolv] Handle TCP Requester #recv_reply incomplete data
https://github.com/ruby/resolv/commit/9c640bdc4a
Diffstat (limited to 'test')
-rw-r--r--test/resolv/test_dns.rb61
1 files changed, 61 insertions, 0 deletions
diff --git a/test/resolv/test_dns.rb b/test/resolv/test_dns.rb
index 1dda9bc627..7a01909eeb 100644
--- a/test/resolv/test_dns.rb
+++ b/test/resolv/test_dns.rb
@@ -881,4 +881,65 @@ class TestResolvDNS < Test::Unit::TestCase
client_thread.join
end
end
+
+ def test_tcp_connection_closed_with_partial_length_prefix
+ with_tcp('127.0.0.1', 0) do |t|
+ _, server_port, _, server_address = t.addr
+
+ server_thread = Thread.new do
+ ct = t.accept
+ ct.recv(512)
+ ct.write "A" # 1 byte
+ ct.close
+ end
+
+ client_thread = Thread.new do
+ requester = Resolv::DNS::Requester::TCP.new(server_address, server_port)
+ begin
+ msg = Resolv::DNS::Message.new
+ msg.add_question('example.org', Resolv::DNS::Resource::IN::A)
+ sender = requester.sender(msg, msg)
+ assert_raise(Resolv::ResolvTimeout) do
+ requester.request(sender, 2)
+ end
+ ensure
+ requester.close
+ end
+ end
+
+ server_thread.join
+ client_thread.join
+ end
+ end
+
+ def test_tcp_connection_closed_with_partial_message_body
+ with_tcp('127.0.0.1', 0) do |t|
+ _, server_port, _, server_address = t.addr
+
+ server_thread = Thread.new do
+ ct = t.accept
+ ct.recv(512)
+ ct.write([10].pack('n')) # length 10
+ ct.write "12345" # 5 bytes (partial)
+ ct.close
+ end
+
+ client_thread = Thread.new do
+ requester = Resolv::DNS::Requester::TCP.new(server_address, server_port)
+ begin
+ msg = Resolv::DNS::Message.new
+ msg.add_question('example.org', Resolv::DNS::Resource::IN::A)
+ sender = requester.sender(msg, msg)
+ assert_raise(Resolv::ResolvTimeout) do
+ requester.request(sender, 2)
+ end
+ ensure
+ requester.close
+ end
+ end
+
+ server_thread.join
+ client_thread.join
+ end
+ end
end