summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSteven Hazel <sah@awesame.org>2009-03-05 19:10:03 -0800
committerSteven Hazel <sah@awesame.org>2009-03-05 19:10:03 -0800
commit70f270bb54fdaa3f33b8ac739db9204f0f71304e (patch)
tree336de6ede9f544128f97a098c7314291c2ac8d50 /lib
parentb05c51790614fc6493791d6d08769c5274ed5e5d (diff)
downloadnet-ssh-70f270bb54fdaa3f33b8ac739db9204f0f71304e.tar.gz
Avoid mixing buffered and unbuffered IO.
This is important here because of this passage from RFC 4253: "When compatibility with old clients is not needed, the server MAY send its initial key exchange data immediately after the identification string."
Diffstat (limited to 'lib')
-rw-r--r--lib/net/ssh/transport/server_version.rb19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/net/ssh/transport/server_version.rb b/lib/net/ssh/transport/server_version.rb
index 374e13e..c5b64d8 100644
--- a/lib/net/ssh/transport/server_version.rb
+++ b/lib/net/ssh/transport/server_version.rb
@@ -40,10 +40,18 @@ module Net; module SSH; module Transport
def negotiate!(socket)
info { "negotiating protocol version" }
- loop do
- @version = socket.readline
- break if @version.nil? || @version.match(/^SSH-/)
- @header << @version
+ catch :DEAD do
+ loop do
+ @version = ""
+ loop do
+ b = socket.recv(1)
+ throw :DEAD if b.nil?
+ @version << b
+ break if b == "\n"
+ end
+ break if @version.match(/^SSH-/)
+ @header << @version
+ end
end
@version.chomp!
@@ -55,6 +63,7 @@ module Net; module SSH; module Transport
debug { "local is `#{PROTO_VERSION}'" }
socket.write "#{PROTO_VERSION}\r\n"
+ socket.flush
end
end
-end; end; end \ No newline at end of file
+end; end; end