Skip to content

Commit 9f46151

Browse files
cfbolzYevhenii Yatchenko
authored andcommitted
close connection._rfile in Connection._force_close (PyMySQL#1184)
fix PyMySQL#1183.
1 parent 37fd1e1 commit 9f46151

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

pymysql/connections.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class Connection(object):
176176
"""
177177

178178
_sock = None
179+
_rfile = None
179180
_auth_plugin_name = ''
180181
_closed = False
181182
_secure = False
@@ -372,6 +373,8 @@ def open(self):
372373

373374
def _force_close(self):
374375
"""Close connection without QUIT message"""
376+
if self._rfile:
377+
self._rfile.close()
375378
if self._sock:
376379
try:
377380
self._sock.close()
@@ -600,12 +603,7 @@ def connect(self, sock=None):
600603
if self.autocommit_mode is not None:
601604
self.autocommit(self.autocommit_mode)
602605
except BaseException as e:
603-
self._rfile = None
604-
if sock is not None:
605-
try:
606-
sock.close()
607-
except: # noqa
608-
pass
606+
self._force_close()
609607

610608
if isinstance(e, (OSError, IOError, socket.error)):
611609
exc = err.OperationalError(

pymysql/tests/test_connection.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,3 +565,40 @@ def test_commit_during_multi_result(self):
565565
con.commit()
566566
cur.execute("SELECT 3")
567567
self.assertEqual(cur.fetchone()[0], 3)
568+
569+
def test_force_close_closes_socketio(self):
570+
con = self.connect()
571+
sock = con._sock
572+
fileno = sock.fileno()
573+
rfile = con._rfile
574+
575+
con._force_close()
576+
assert rfile.closed
577+
assert sock._closed
578+
assert sock.fileno() != fileno # should be set to -1
579+
580+
def test_socket_closed_on_exception_in_connect(self):
581+
con = self.connect(defer_connect=True)
582+
sock = None
583+
rfile = None
584+
fileno = -1
585+
586+
def _request_authentication():
587+
nonlocal sock, rfile, fileno
588+
sock = con._sock
589+
assert sock is not None
590+
fileno = sock.fileno()
591+
rfile = con._rfile
592+
assert rfile is not None
593+
raise TypeError
594+
595+
con._request_authentication = _request_authentication
596+
597+
with pytest.raises(TypeError):
598+
con.connect()
599+
assert not con.open
600+
assert con._rfile is None
601+
assert con._sock is None
602+
assert rfile.closed
603+
assert sock._closed
604+
assert sock.fileno() != fileno # should be set to -1

0 commit comments

Comments
 (0)