[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [stem/master] Using binary mode for the controller socket file
commit 9cd4c9feb479fe00987526c272a1b2a1853bd295
Author: Damian Johnson <atagar@xxxxxxxxxxxxxx>
Date: Sat Feb 2 12:23:07 2013 -0800
Using binary mode for the controller socket file
Yay! Now that I have a version of python 3 that doesn't segfault I can finish
making our integ tests work.
The socket file used for controller connections should be normalized to use
binary mode. This is its behavior in python 2.x, and in 3.x having it in text
mode can cause sadness.
Exception in thread Tor Listener:
Traceback (most recent call last):
File "/home/atagar/Desktop/Python-3.3.0/Lib/threading.py", line 639, in _bootstrap_inner
self.run()
File "/home/atagar/Desktop/Python-3.3.0/Lib/threading.py", line 596, in run
self._target(*self._args, **self._kwargs)
File "/home/atagar/Desktop/stem/test/data/python3/stem/control.py", line 573, in _reader_loop
control_message = self._socket.recv()
File "/home/atagar/Desktop/stem/test/data/python3/stem/socket.py", line 115, in recv
return recv_message(socket_file)
File "/home/atagar/Desktop/stem/test/data/python3/stem/socket.py", line 539, in recv_message
line = control_file.readline()
File "/home/atagar/Desktop/Python-3.3.0/Lib/codecs.py", line 300, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 2005: invalid continuation byte
After addressing this and a few encoding issues the controller integ tests now
pass, but after we're done testing python spews out a dump following...
*** glibc detected *** python3: munmap_chunk(): invalid pointer: 0x097f1620 ***
At this point I'm pretty well persuaded that the python 3.x series leaves
something to be desired in terms of stability.
---
stem/socket.py | 16 +++++++++-------
test/integ/control/controller.py | 2 +-
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/stem/socket.py b/stem/socket.py
index f0786ab..4277fa1 100644
--- a/stem/socket.py
+++ b/stem/socket.py
@@ -37,6 +37,7 @@ import threading
import stem.prereq
import stem.response
+import stem.util.str_tools
from stem.util import log
@@ -182,12 +183,7 @@ class ControlSocket(object):
with self._recv_lock:
self._socket = self._make_socket()
-
- if stem.prereq.is_python_3():
- self._socket_file = self._socket.makefile(mode = "rw", newline = "")
- else:
- self._socket_file = self._socket.makefile(mode = "rw")
-
+ self._socket_file = self._socket.makefile(mode = "rwb")
self._is_alive = True
# It's possible for this to have a transient failure...
@@ -425,7 +421,7 @@ def send_message(control_file, message, raw = False):
message = send_formatting(message)
try:
- control_file.write(message)
+ control_file.write(stem.util.str_tools.to_bytes(message))
control_file.flush()
log_message = message.replace("\r\n", "\n").rstrip()
@@ -471,6 +467,9 @@ def recv_message(control_file):
while True:
try:
line = control_file.readline()
+
+ if stem.prereq.is_python_3():
+ line = stem.util.str_tools.to_unicode(line)
except AttributeError:
# if the control_file has been closed then we will receive:
# AttributeError: 'NoneType' object has no attribute 'recv'
@@ -537,6 +536,9 @@ def recv_message(control_file):
while True:
try:
line = control_file.readline()
+
+ if stem.prereq.is_python_3():
+ line = stem.util.str_tools.to_unicode(line)
except socket.error, exc:
prefix = logging_prefix % "SocketClosed"
log.info(prefix + "received an exception while mid-way through a data reply (exception: \"%s\", read content: \"%s\")" % (exc, log.escape(raw_content)))
diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py
index 600403b..15168a4 100644
--- a/test/integ/control/controller.py
+++ b/test/integ/control/controller.py
@@ -568,7 +568,7 @@ class TestController(unittest.TestCase):
controller.set_conf("ContactInfo", "confsaved")
controller.save_conf()
- with file(runner.get_torrc_path()) as torrcfile:
+ with open(runner.get_torrc_path()) as torrcfile:
self.assertTrue("\nContactInfo confsaved\n" in torrcfile.read())
finally:
controller.load_conf(oldconf)
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits