summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.rdoc2
-rw-r--r--lib/net/ssh/proxy/socks5.rb26
2 files changed, 23 insertions, 5 deletions
diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc
index 6d80c37..889bb6b 100644
--- a/CHANGELOG.rdoc
+++ b/CHANGELOG.rdoc
@@ -2,6 +2,8 @@
=== 2.0.13 / ?? Aug 2009
+* Applied patch for Socks5 negotiation fix [Gerald Talton]
+
* Added support for specifying a list of hosts in .ssh/config, with tests (GH-6) [Delano Mandelbaum]
* Added tests for arcfour128/256/512 lengths, encryption, and decryption [Delano Mandelbaum]
diff --git a/lib/net/ssh/proxy/socks5.rb b/lib/net/ssh/proxy/socks5.rb
index 2d6918a..cc0642a 100644
--- a/lib/net/ssh/proxy/socks5.rb
+++ b/lib/net/ssh/proxy/socks5.rb
@@ -94,11 +94,27 @@ 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)
+ if ( address_type == 1 )
+ socket.recv(4) # get four bytes for IPv4 address
+ else
+ if ( address_type == 3 )
+ len = socket.recv(1).getbyte(0)
+ hostname = socket.recv(len)
+ else
+ if ( address_type == 4 )
+ ipv6addr hostname = socket.recv(16)
+ else
+ socket.close
+ raise ConnectionError, "Illegal response type"
+ end
+ end
+ end
+ #portnum = socket.recv(2)
+
unless reply == SUCCESS
socket.close
raise ConnectError, "#{reply}"