--- ssl.py.orig 2020-08-07 17:18:47.979040464 +0900 +++ ssl.py 2020-08-20 10:44:27.143001000 +0900 @@ -174,7 +174,8 @@ import base64 # for DER-to-PEM translation import errno import warnings - +# bugfix: SSLError sslv3 alert bad record mac +import threading socket_error = OSError # keep that public name in module namespace @@ -659,6 +660,8 @@ owner=self, session=session ) self._sslobj = sslobj + # bugfix: SSLError sslv3 alert bad record mac + self._read_write_sync = threading.Lock() return self @property @@ -701,11 +704,13 @@ If 'buffer' is provided, read into this buffer and return the number of bytes read. """ - if buffer is not None: - v = self._sslobj.read(len, buffer) - else: - v = self._sslobj.read(len) - return v + # bugfix: SSLError sslv3 alert bad record mac + with self._read_write_sync: + if buffer is not None: + v = self._sslobj.read(len, buffer) + else: + v = self._sslobj.read(len) + return v def write(self, data): """Write 'data' to the SSL object and return the number of bytes @@ -713,7 +718,9 @@ The 'data' argument must support the buffer interface. """ - return self._sslobj.write(data) + # bugfix: SSLError sslv3 alert bad record mac + with self._read_write_sync: + return self._sslobj.write(data) def getpeercert(self, binary_form=False): """Returns a formatted version of the data in the certificate provided