aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/vici/ruby
diff options
context:
space:
mode:
authorEvan Broder <evan@stripe.com>2015-08-22 19:20:40 -0400
committerTobias Brunner <tobias@strongswan.org>2015-08-24 11:24:05 +0200
commit78ed3300997bca2a65406f74e6b044dc1698ed55 (patch)
tree659f9a6760803fc691da8f2a5d46b62023e325b3 /src/libcharon/plugins/vici/ruby
parentba3298fa8da4c5576d73ee2029a18ecf993d3d12 (diff)
downloadstrongswan-78ed3300997bca2a65406f74e6b044dc1698ed55.tar.bz2
strongswan-78ed3300997bca2a65406f74e6b044dc1698ed55.tar.xz
vici: Handle closed sockets in the Ruby gem
From recvfrom(2) (which UDPSocket#recv backs into): The return value will be 0 when the peer has performed an orderly shutdown. (i.e. it will return an empty string) Previously in this scenario, Vici::Transport#recv_all would spin forever trying to pull more data off the socket. I'm not entirely clear what happened that caused strongSwan to shutdown the socket, but it probably should not cause vici Ruby apps to spin. Closes strongswan/strongswan#13.
Diffstat (limited to 'src/libcharon/plugins/vici/ruby')
-rw-r--r--src/libcharon/plugins/vici/ruby/lib/vici.rb6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/libcharon/plugins/vici/ruby/lib/vici.rb b/src/libcharon/plugins/vici/ruby/lib/vici.rb
index f87e46e69..f8169add0 100644
--- a/src/libcharon/plugins/vici/ruby/lib/vici.rb
+++ b/src/libcharon/plugins/vici/ruby/lib/vici.rb
@@ -247,7 +247,11 @@ module Vici
def recv_all(len)
encoding = ""
while encoding.length < len do
- encoding << @socket.recv(len - encoding.length)
+ data = @socket.recv(len - encoding.length)
+ if data.empty?
+ raise TransportError, "connection closed"
+ end
+ encoding << data
end
encoding
end