From ab2097ef04fa3cb4486e076ac4d6ecb843df5cfb Mon Sep 17 00:00:00 2001 From: Robert Byrnes Date: Fri, 24 May 2019 16:35:55 -0400 Subject: [PATCH] Add retry on EINTR. Fixes https://github.com/python-ldap/python-ldap/issues/242. --- Lib/ldap/ldapobject.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Lib/ldap/ldapobject.py b/Lib/ldap/ldapobject.py index f7443fad..e9950a8f 100644 --- a/Lib/ldap/ldapobject.py +++ b/Lib/ldap/ldapobject.py @@ -32,6 +32,22 @@ from ldap import LDAPError +from errno import EINTR + +def _retry_if_interrupted(func, *args, **kwargs): + """Call func, retrying if it raises an LDAPError with errno == EINTR. + """ + + while True: + try: + return func(*args, **kwargs) + except LDAPError as e: + try: + if e.args[0]['errno'] != EINTR: + raise + except (AttributeError, IndexError, KeyError): + raise e + PY2 = sys.version_info[0] <= 2 if PY2: text_type = unicode @@ -312,7 +328,7 @@ def _ldap_call(self,func,*args,**kwargs): diagnostic_message_success = None try: try: - result = func(*args,**kwargs) + result = _retry_if_interrupted(func, *args, **kwargs) if __debug__ and self._trace_level>=2: if func.__name__!="unbind_ext": diagnostic_message_success = self._l.get_option(ldap.OPT_DIAGNOSTIC_MESSAGE)