summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordelano <delano@solutious.com>2009-08-12 19:14:02 -0400
committerdelano <delano@solutious.com>2009-08-12 19:14:02 -0400
commitd5a6437256ae524bd7048f9225635d9fb9c6b264 (patch)
tree698d0f3d9fb4bd44aa1e34e0577487bb11b4ae6d
parent833147e0525f0b25bc6ecea99bf1e59c2c3c22ee (diff)
downloadnet-ssh-d5a6437256ae524bd7048f9225635d9fb9c6b264.tar.gz
Re-added refactored fix for hanging in ServerVersion#negotiate! when using SOCKS5 proxy [Gerald Talton]. Closes GH-9
-rw-r--r--CHANGELOG.rdoc2
-rw-r--r--lib/net/ssh/proxy/socks5.rb23
-rw-r--r--lib/net/ssh/transport/server_version.rb1
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?