diff options
| author | Steven Hazel <sah@awesame.org> | 2009-03-05 19:10:03 -0800 |
|---|---|---|
| committer | Steven Hazel <sah@awesame.org> | 2009-03-05 19:10:03 -0800 |
| commit | 70f270bb54fdaa3f33b8ac739db9204f0f71304e (patch) | |
| tree | 336de6ede9f544128f97a098c7314291c2ac8d50 /lib | |
| parent | b05c51790614fc6493791d6d08769c5274ed5e5d (diff) | |
| download | net-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.rb | 19 |
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 |
