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.
This commit is contained in:
Jeremy Hylton 2001-10-29 16:32:19 +00:00
parent 2836907bbb
commit fbd5797eb7
1 changed files with 16 additions and 5 deletions

View File

@ -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)
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)
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)