Tk Library Source Code

Artifact [f9b560922d]
Login

Artifact f9b560922d826b2a1f25b5577937d87d092366f4:

Attachment "ftp-multiline-reply-infinite-loop.patch" to ticket [3288977fff] added by szinck 2011-04-19 01:14:59.
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Author: Shaun Zinck <[email protected]>
Date:   Wed Mar 23 16:48:27 2011 -0500

    tcllib ftp: check for eof on socket while fetching data
    
    This alleviates problems when the ftp server doesn't speak strict
    RFC-959 , at least for the very last message sent.
    
    For example, this was causing Tcllib ftp code to have an infinite loop
    and eat 100% cpu.
    
    RETR blah
    150 Opening BINARY mode data connection for blah (180 bytes).
    226 Transfer complete.
    QUIT
    221-You have transferred 180 bytes in 1 files.
    
    ^^^ notice no "221 Goodbye."

diff --git a/ftp.tcl b/ftp.tcl
index xxxxxxx..xxxxxxx 100644
--- a/ftp.tcl
+++ b/ftp.tcl
@@ -274,6 +274,14 @@ proc ::ftp::StateHandler {s {sock ""}} {
 			# multi_line is not set if the bufline does not match the regexp,
 			# I.e. this keeps the '-' which started this around until the
 			# closing line does match and sets it to space.
+		    } elseif {$number == -1 && [eof $sock]} {
+			# The reply indicated a multi-line reply, but the
+			# socket was closed and there were no more lines.
+			# In that case, keep the current return values.
+
+			# This means the server isn't speaking strict rfc959.
+			# see section on multi-line replies
+			break
 		    }
 		}