diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-10-29 16:32:19 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-10-29 16:32:19 (GMT) |
commit | fbd5797eb7aa2f2e291a11081f5c5160614fdd45 (patch) | |
tree | 257ffac513c26bc43da4bfad3ba6be9a3a986b3a /Lib | |
parent | 2836907bbb62272db4186d89e684108b90ded8fe (diff) | |
download | cpython-fbd5797eb7aa2f2e291a11081f5c5160614fdd45.zip cpython-fbd5797eb7aa2f2e291a11081f5c5160614fdd45.tar.gz cpython-fbd5797eb7aa2f2e291a11081f5c5160614fdd45.tar.bz2 |
Fix for SF bug 453099 -- select not defensive
And SF patch 473223 -- infinite getattr loop
Wrap select() and poll() calls with try/except for EINTR. If EINTR is
raised, treat as a response where no fd is ready.
In dispatcher constructor, make sure self.socket is always
initialized.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/asyncore.py | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 4864eb4..613804d 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -53,7 +53,7 @@ import sys import os from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, \ - ENOTCONN, ESHUTDOWN + ENOTCONN, ESHUTDOWN, EINTR try: socket_map @@ -66,7 +66,6 @@ class ExitNow (exceptions.Exception): DEBUG = 0 def poll (timeout=0.0, map=None): - global DEBUG if map is None: map = socket_map if map: @@ -76,7 +75,11 @@ def poll (timeout=0.0, map=None): r.append (fd) if obj.writable(): w.append (fd) - r,w,e = select.select (r,w,e, timeout) + try: + r,w,e = select.select (r,w,e, timeout) + except select.error, err: + if err[0] != EINTR: + raise if DEBUG: print r,w,e @@ -158,7 +161,12 @@ def poll3 (timeout=0.0, map=None): flags = flags | select.POLLOUT if flags: pollster.register(fd, flags) - r = pollster.poll (timeout) + try: + r = pollster.poll (timeout) + except select.error, err: + if err[0] != EINTR: + raise + r = [] for fd, flags in r: try: obj = map[fd] @@ -205,6 +213,8 @@ class dispatcher: self.socket.setblocking (0) self.connected = 1 self.addr = sock.getpeername() + else: + self.socket = None def __repr__ (self): status = [self.__class__.__module__+"."+self.__class__.__name__] @@ -241,7 +251,8 @@ class dispatcher: self.add_channel() def set_socket (self, sock, map=None): - self.__dict__['socket'] = sock + self.socket = sock +## self.__dict__['socket'] = sock self._fileno = sock.fileno() self.add_channel (map) |