summaryrefslogtreecommitdiffstats
path: root/Lib/asyncore.py
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2001-10-29 16:32:19 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2001-10-29 16:32:19 (GMT)
commitfbd5797eb7aa2f2e291a11081f5c5160614fdd45 (patch)
tree257ffac513c26bc43da4bfad3ba6be9a3a986b3a /Lib/asyncore.py
parent2836907bbb62272db4186d89e684108b90ded8fe (diff)
downloadcpython-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/asyncore.py')
-rw-r--r--Lib/asyncore.py21
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)