commit f2a4994175b9cb982beceb868133c51296482fc0 Author: Damian Johnson atagar@torproject.org Date: Sun Sep 14 16:19:17 2014 -0700
launch_tor_with_config() raises an OSError if called too many times
Issue caught by RSenet on...
https://trac.torproject.org/projects/tor/ticket/13141
We didn't close our torrc's file descriptor, causing an OSError if the function is called too many times. --- docs/change_log.rst | 1 + stem/process.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst index ff58d12..ff5b60d 100644 --- a/docs/change_log.rst +++ b/docs/change_log.rst @@ -46,6 +46,7 @@ The following are only available within Stem's `git repository * Added :func:`~stem.control.BaseController.connection_time` to the :class:`~stem.control.BaseController` * Changed :func:`~stem.control.Controller.get_microdescriptor`, :func:`~stem.control.Controller.get_server_descriptor`, and :func:`~stem.control.Controller.get_network_status` to get our own descriptor if no fingerprint or nickname is provided. * Added :class:`~stem.exit_policy.ExitPolicy` methods for more easily handling 'private' policies (the `default prefix https://www.torproject.org/docs/tor-manual.html.en#ExitPolicyRejectPrivate`_) and the defaultly appended suffix. This includes :func:`~stem.exit_policy.ExitPolicy.has_private`, :func:`~stem.exit_policy.ExitPolicy.strip_private`, :func:`~stem.exit_policy.ExitPolicy.has_default`, and :func:`~stem.exit_policy.ExitPolicy.strip_default` :class:`~stem.exit_policy.ExitPolicy` methods in addition to :func:`~stem.exit_policy.ExitPolicyRule.is_private` and :func:`~stem.exit_policy.ExitPolicyRule.is_default` for the :class:`~stem.exit_policy.ExitPolicyRule`. (:trac:`10107`) + * :func:`~stem.process.launch_tor_with_config` could cause a "Too many open files" OSError if called too many times (:trac:`13141`)
* **Descriptors**
diff --git a/stem/process.py b/stem/process.py index 2886270..af66cce 100644 --- a/stem/process.py +++ b/stem/process.py @@ -227,7 +227,7 @@ def launch_tor_with_config(config, tor_cmd = 'tor', completion_percent = 100, in if not has_stdout: config['Log'].append('NOTICE stdout')
- torrc_path = tempfile.mkstemp(prefix = 'torrc-', text = True)[1] + torrc_descriptor, torrc_path = tempfile.mkstemp(prefix = 'torrc-', text = True)
try: with open(torrc_path, 'w') as torrc_file: @@ -244,6 +244,7 @@ def launch_tor_with_config(config, tor_cmd = 'tor', completion_percent = 100, in return launch_tor(tor_cmd, args, torrc_path, completion_percent, init_msg_handler, timeout, take_ownership) finally: try: + os.close(torrc_descriptor) os.remove(torrc_path) except: pass