THRIFT-3634 Fix Python TSocket resource leak on connection failure
Client: Python
Patch: Nobuaki Sukegawa
This closes #867
diff --git a/lib/py/src/transport/TSSLSocket.py b/lib/py/src/transport/TSSLSocket.py
index a66461a..4cae27c 100644
--- a/lib/py/src/transport/TSSLSocket.py
+++ b/lib/py/src/transport/TSSLSocket.py
@@ -275,37 +275,18 @@
DeprecationWarning, stacklevel=2)
self.cert_reqs = ssl.CERT_REQUIRED if value else ssl.CERT_NONE
- def open(self):
+ def _do_open(self, family, socktype):
+ plain_sock = socket.socket(family, socktype)
try:
- addrs = self._resolveAddr()
- for addr in addrs:
- sock_family, sock_type, _, _, ip_port = addr
- plain_sock = socket.socket(sock_family, sock_type)
- self.handle = self._wrap_socket(plain_sock)
- self.handle.settimeout(self._timeout)
- try:
- self.handle.connect(ip_port)
- except socket.error:
- self.handle.close()
- if addr is not addrs[-1]:
- logger.warning(
- 'Error while connecting with %s. Trying next one.',
- ip_port, exc_info=True)
- continue
- else:
- raise
- break
- except socket.error as e:
- if self._unix_socket:
- message = 'Could not connect to secure socket %s: %s' \
- % (self._unix_socket, e)
- else:
- message = 'Could not connect to %s:%d: %s' \
- % (self.host, self.port, e)
- logger.exception(
- 'Error while connecting with %s.', ip_port)
- raise TTransportException(TTransportException.NOT_OPEN, message)
+ return self._wrap_socket(plain_sock)
+ except Exception:
+ plain_sock.close()
+ msg = 'failed to initialize SSL'
+ logger.exception(msg)
+ raise TTransportException(TTransportException.NOT_OPEN, msg)
+ def open(self):
+ super(TSSLSocket, self).open()
if self._should_verify:
self.peercert = self.handle.getpeercert()
try: