From fbd5797eb7aa2f2e291a11081f5c5160614fdd45 Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Mon, 29 Oct 2001 16:32:19 +0000 Subject: 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. --- Lib/asyncore.py | 21 ++++++++++++++++----- 1 file 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) -- cgit v0.12