summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordelano <delano@solutious.com>2009-08-10 19:57:15 -0400
committerdelano <delano@solutious.com>2009-08-10 19:57:15 -0400
commit0b068166293dcbb82833ee5a04f4151c30d82677 (patch)
treec653e0cf66b4662b38b5fd1db91fcec1d47074a9
parent607b9fd784746838a1c431c1752cf78ae4dc1210 (diff)
downloadnet-ssh-0b068166293dcbb82833ee5a04f4151c30d82677.tar.gz
Applied patch for Socks5 negotiation fix [Gerald Talton]
-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}"