diff options
author | Nadeem Vawda <nadeem.vawda@gmail.com> | 2011-07-23 12:03:00 (GMT) |
---|---|---|
committer | Nadeem Vawda <nadeem.vawda@gmail.com> | 2011-07-23 12:03:00 (GMT) |
commit | 08f5f7aa81321eb667609b2f096b2fc0c092cad4 (patch) | |
tree | 2c2b21982de26e2c715f4471ba11bf4edbd2dff2 /Lib/ftplib.py | |
parent | de02a7194c50cc2244798e086d94fa0a4f33ab91 (diff) | |
download | cpython-08f5f7aa81321eb667609b2f096b2fc0c092cad4.zip cpython-08f5f7aa81321eb667609b2f096b2fc0c092cad4.tar.gz cpython-08f5f7aa81321eb667609b2f096b2fc0c092cad4.tar.bz2 |
Issue #10883: Fix socket leaks in urllib.request.
* ftpwrapper now uses reference counting to ensure that the underlying socket
is closed when the ftpwrapper object is no longer in use
* ftplib.FTP.ntransfercmd() now closes the socket if an error occurs
Initial patch by Victor Stinner.
Diffstat (limited to 'Lib/ftplib.py')
-rw-r--r-- | Lib/ftplib.py | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/Lib/ftplib.py b/Lib/ftplib.py index be1797f..8e53023 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -336,33 +336,39 @@ class FTP: if self.passiveserver: host, port = self.makepasv() conn = socket.create_connection((host, port), self.timeout) - if rest is not None: - self.sendcmd("REST %s" % rest) - resp = self.sendcmd(cmd) - # Some servers apparently send a 200 reply to - # a LIST or STOR command, before the 150 reply - # (and way before the 226 reply). This seems to - # be in violation of the protocol (which only allows - # 1xx or error messages for LIST), so we just discard - # this response. - if resp[0] == '2': - resp = self.getresp() - if resp[0] != '1': - raise error_reply(resp) + try: + if rest is not None: + self.sendcmd("REST %s" % rest) + resp = self.sendcmd(cmd) + # Some servers apparently send a 200 reply to + # a LIST or STOR command, before the 150 reply + # (and way before the 226 reply). This seems to + # be in violation of the protocol (which only allows + # 1xx or error messages for LIST), so we just discard + # this response. + if resp[0] == '2': + resp = self.getresp() + if resp[0] != '1': + raise error_reply(resp) + except: + conn.close() + raise else: sock = self.makeport() - if rest is not None: - self.sendcmd("REST %s" % rest) - resp = self.sendcmd(cmd) - # See above. - if resp[0] == '2': - resp = self.getresp() - if resp[0] != '1': - raise error_reply(resp) - conn, sockaddr = sock.accept() - if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT: - conn.settimeout(self.timeout) - sock.close() + try: + if rest is not None: + self.sendcmd("REST %s" % rest) + resp = self.sendcmd(cmd) + # See above. + if resp[0] == '2': + resp = self.getresp() + if resp[0] != '1': + raise error_reply(resp) + conn, sockaddr = sock.accept() + if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT: + conn.settimeout(self.timeout) + finally: + sock.close() if resp[:3] == '150': # this is conditional in case we received a 125 size = parse150(resp) |