summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/net/ftp.rb31
2 files changed, 22 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 073c7de1cb..3610cee7d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed May 28 00:06:18 2014 Tanaka Akira <akr@fsij.org>
+
+ * lib/net/ftp.rb (transfercmd): Close TCP server socket even if an
+ exception occur.
+
Tue May 27 23:50:07 2014 Tanaka Akira <akr@fsij.org>
* lib/cgi/core.rb: Use Tempfile#close(true) instead of Tempfile#unlink
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 5ebf262185..eabe6f5f08 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -420,23 +420,26 @@ module Net
end
else
sock = makeport
- if @resume and rest_offset
- resp = sendcmd("REST " + rest_offset.to_s)
- if resp[0] != ?3
+ begin
+ if @resume and rest_offset
+ resp = sendcmd("REST " + rest_offset.to_s)
+ if resp[0] != ?3
+ raise FTPReplyError, resp
+ end
+ end
+ resp = sendcmd(cmd)
+ # skip 2XX for some ftp servers
+ resp = getresp if resp[0] == ?2
+ if resp[0] != ?1
raise FTPReplyError, resp
end
+ conn = BufferedSocket.new(sock.accept)
+ conn.read_timeout = @read_timeout
+ sock.shutdown(Socket::SHUT_WR) rescue nil
+ sock.read rescue nil
+ ensure
+ sock.close
end
- resp = sendcmd(cmd)
- # skip 2XX for some ftp servers
- resp = getresp if resp[0] == ?2
- if resp[0] != ?1
- raise FTPReplyError, resp
- end
- conn = BufferedSocket.new(sock.accept)
- conn.read_timeout = @read_timeout
- sock.shutdown(Socket::SHUT_WR) rescue nil
- sock.read rescue nil
- sock.close
end
return conn
end