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
unittests.

This is a cherry-pick of master commit
965d0e5b

 with the portions not relevant
to 2.1 removed (changes to the RetryOnSignals function).
Signed-off-by: default avatarGuido Trotter <ultrotter@google.com>
Reviewed-by: default avatarIustin Pop <iustin@google.com>
parent 2652b363
......@@ -2518,10 +2518,12 @@ def IgnoreSignals(fn, *args, **kwargs):
"""
try:
return fn(*args, **kwargs)
except (EnvironmentError, socket.error), err:
except EnvironmentError, err:
if err.errno != errno.EINTR:
raise
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):
raise
......
......@@ -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