Commit 14aeab22 authored by Guido Trotter's avatar Guido Trotter
Browse files

Fix IgnoreSignals on socket.error

Some confusion arose handling EINTR on this function: in python 2.6
socket.error is an IOError, and thus:
  - It's an EnvironmentError
  - It has an .errno member

In 2.4 and 2.5 it's not, and so its errno variable must be extracted
from the args tuple. This patch fixes both the function, and the

This is a cherry-pick of master commit

 with the portions not relevant
to 2.1 removed (changes to the RetryOnSignals function).
Signed-off-by: default avatarGuido Trotter <>
Reviewed-by: default avatarIustin Pop <>
parent 2652b363
......@@ -2518,10 +2518,12 @@ def IgnoreSignals(fn, *args, **kwargs):
return fn(*args, **kwargs)
except (EnvironmentError, socket.error), err:
except EnvironmentError, err:
if err.errno != errno.EINTR:
except select.error, err:
except (select.error, socket.error), err:
# In python 2.6 and above select.error is an IOError, so it's handled
# above, in 2.5 and below it's not, and it's handled here.
if not (err.args and err.args[0] == errno.EINTR):
......@@ -1836,9 +1836,7 @@ class TestIgnoreSignals(unittest.TestCase):
def testIgnoreSignals(self):
sock_err_intr = socket.error(errno.EINTR, "Message")
sock_err_intr.errno = errno.EINTR
sock_err_inval = socket.error(errno.EINVAL, "Message")
sock_err_inval.errno = errno.EINVAL
env_err_intr = EnvironmentError(errno.EINTR, "Message")
env_err_inval = EnvironmentError(errno.EINVAL, "Message")
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment