From d5a6437256ae524bd7048f9225635d9fb9c6b264 Mon Sep 17 00:00:00 2001 From: delano Date: Wed, 12 Aug 2009 19:14:02 -0400 Subject: Re-added refactored fix for hanging in ServerVersion#negotiate! when using SOCKS5 proxy [Gerald Talton]. Closes GH-9 --- CHANGELOG.rdoc | 2 +- lib/net/ssh/proxy/socks5.rb | 23 ++++++++++++++++++----- lib/net/ssh/transport/server_version.rb | 1 - 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index 6654dc1..8b8007d 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -2,7 +2,7 @@ === 2.0.13 / ?? Aug 2009 -* Added fix for hanging in ServerVersion#negotiate! when using SOCKS5 proxy [Delano Mandelbaum, Gerald Talton] +* Added fix for hanging in ServerVersion#negotiate! when using SOCKS5 proxy (GH-9) [Gerald Talton] * Added support for specifying a list of hosts in .ssh/config, with tests (GH-6) [Delano Mandelbaum] diff --git a/lib/net/ssh/proxy/socks5.rb b/lib/net/ssh/proxy/socks5.rb index 2d6918a..7fc0600 100644 --- a/lib/net/ssh/proxy/socks5.rb +++ b/lib/net/ssh/proxy/socks5.rb @@ -94,11 +94,24 @@ module Net packet << [port].pack("n") socket.send packet, 0 - - version, reply, = socket.recv(4).unpack("C*") - len = socket.recv(1).getbyte(0) - socket.recv(len + 2) - + + version, reply, = socket.recv(2).unpack("C*") + socket.recv(1) + address_type = socket.recv(1).getbyte(0) + case address_type + when 1 + socket.recv(4) # get four bytes for IPv4 address + when 3 + len = socket.recv(1).getbyte(0) + hostname = socket.recv(len) + when 4 + ipv6addr hostname = socket.recv(16) + else + socket.close + raise ConnectionError, "Illegal response type" + end + portnum = socket.recv(2) + unless reply == SUCCESS socket.close raise ConnectError, "#{reply}" diff --git a/lib/net/ssh/transport/server_version.rb b/lib/net/ssh/transport/server_version.rb index 51343a3..9a0fb60 100644 --- a/lib/net/ssh/transport/server_version.rb +++ b/lib/net/ssh/transport/server_version.rb @@ -43,7 +43,6 @@ module Net; module SSH; module Transport loop do @version = "" loop do - #break unless socket.available_for_read? b = socket.recv(1) if b.nil? -- cgit v1.2.1