issue #254: fork: take care not to rely on FD numbers.

pull/255/head
David Wilson 6 years ago
parent fc59f57ba2
commit e118963b30

@ -136,6 +136,7 @@ class Stream(mitogen.parent.Stream):
# Expected by the ExternalContext.main().
os.dup2(childfp.fileno(), 1)
os.dup2(childfp.fileno(), 100)
# Overwritten by ExternalContext.main(); we must replace the
# parent-inherited descriptors that were closed by Side._on_fork() to
# avoid ExternalContext.main() accidentally allocating new files over
@ -148,7 +149,11 @@ class Stream(mitogen.parent.Stream):
if devnull != 2:
os.dup2(devnull, 2)
os.close(devnull)
childfp.close()
# If we're unlucky, childfp.fileno() may coincidentally be one of our
# desired FDs. In that case closing it breaks ExternalContext.main().
if childfp.fileno() not in (0, 1, 100):
childfp.close()
config = self.get_econtext_config()
config['core_src_fd'] = None
@ -156,8 +161,12 @@ class Stream(mitogen.parent.Stream):
config['setup_package'] = False
if self.on_start:
config['on_start'] = self.on_start
try:
mitogen.core.ExternalContext(config).main()
except Exception:
# TODO: report exception somehow.
os._exit(72)
finally:
# Don't trigger atexit handlers, they were copied from the parent.
os._exit(0)

Loading…
Cancel
Save