mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Merge: #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.
This commit is contained in:
commit
0200016132
4 changed files with 59 additions and 29 deletions
|
@ -343,33 +343,39 @@ class FTP:
|
|||
host, port = self.makepasv()
|
||||
conn = socket.create_connection((host, port), self.timeout,
|
||||
source_address=self.source_address)
|
||||
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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue