From 78ed3300997bca2a65406f74e6b044dc1698ed55 Mon Sep 17 00:00:00 2001 From: Evan Broder Date: Sat, 22 Aug 2015 19:20:40 -0400 Subject: 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. --- src/libcharon/plugins/vici/ruby/lib/vici.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/libcharon/plugins/vici/ruby') 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 -- cgit v1.2.3