New submission from Ids van der Molen:
collect_children routine in SocketServer.py contains two possible race
conditions. First one is in while loop "while len(self.active_children) >=
self.max_children:". If status of child is collected outside of Socket server
(for example in signal handler or something), then the variable
self.active_children will not match actual child processes and the
os.waitpid(0, 0) within the while loop will raise os.error, errno=10 (ECHILD)
"No Child Processes". self.active_children should be emptied in this case,
otherwise you'll end up with an endless loop comsuming 100% CPU (as happened to
us).
The second possible race condition is below in the collect_children routine in
the "for child in self.active_children" which contains a statement
self.active_children.remove(pid) which would modify the iterator. I do not now
about python 2.7, but before this would result in "incorrect iteration".
Original code:
for child in self.active_children:
try:
pid, status = os.waitpid(child, os.WNOHANG)
except os.error:
pid = None
if not pid: continue
try:
self.active_children.remove(pid)
except ValueError, e:
raise ValueError('%s. x=%d and list=%r' % (e.message, pid,
self.active_children))
Fixed code:
to_remove = []
for child in self.active_children:
try:
pid, status = os.waitpid(child, os.WNOHANG)
except os.error:
pid = None
if not pid: continue
to_remove.append(pid)
for pid in to_remove:
try:
self.active_children.remove(pid)
except ValueError, e:
raise ValueError('%s. x=%d and list=%r' % (e.message, pid,
self.active_children))
----------
components: Library (Lib)
messages: 218414
nosy: idsvandermolen
priority: normal
severity: normal
status: open
title: race condition in SocketServer.py ForkingMixIn collect_children
type: resource usage
versions: Python 2.7
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue21491>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com