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.
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 os
 from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, \
-     ENOTCONN, ESHUTDOWN
+     ENOTCONN, ESHUTDOWN, EINTR
 
 try:
     socket_map
@@ -66,7 +66,6 @@
 DEBUG = 0
 
 def poll (timeout=0.0, map=None):
-    global DEBUG
     if map is None:
         map = socket_map
     if map:
@@ -76,7 +75,11 @@
                 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 @@
                 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 @@
             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 @@
         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)