diff --git a/lib/rex/socket/udp.rb b/lib/rex/socket/udp.rb index 59b232c..e0cc77c 100644 --- a/lib/rex/socket/udp.rb +++ b/lib/rex/socket/udp.rb @@ -169,7 +169,7 @@ def timed_recvfrom(maxlen = 65535, timeout = def_read_timeout) data, saddr = recvfrom_nonblock(maxlen) [ data, sender_addr_info(saddr) ] - rescue ::Timeout::Error, ::Errno::ECONNREFUSED + rescue ::Timeout::Error, ::Errno::ECONNREFUSED, ::Errno::ECONNRESET nil end @@ -203,4 +203,3 @@ def type? end end - diff --git a/spec/rex/socket/udp_spec.rb b/spec/rex/socket/udp_spec.rb index 2aa6bf3..b8dab50 100644 --- a/spec/rex/socket/udp_spec.rb +++ b/spec/rex/socket/udp_spec.rb @@ -106,5 +106,17 @@ def make_client(port) ensure server&.close end + + [::Errno::ECONNREFUSED, ::Errno::ECONNRESET].each do |error_class| + it "returns nil when recvfrom_nonblock raises #{error_class}" do + server = make_server + allow(::IO).to receive(:select).with([server], nil, nil, 0.1).and_return([[server], [], []]) + allow(server).to receive(:recvfrom_nonblock).and_raise(error_class) + + expect(server.timed_recvfrom(65535, 0.1)).to be_nil + ensure + server&.close + end + end end end