summaryrefslogtreecommitdiff
path: root/leakcheck
diff options
context:
space:
mode:
authorJean-Paul Calderone <exarkun@boson>2008-09-21 17:42:34 -0400
committerJean-Paul Calderone <exarkun@boson>2008-09-21 17:42:34 -0400
commit00db9daab0b42fed8cf45288624889adad42cb35 (patch)
tree542d11a6cb43d0d2b4ddc6adec220c1eed7c56e5 /leakcheck
parentf1b839dccf33b12f9100ffa91d45b4d1b9167adf (diff)
downloadpyopenssl-00db9daab0b42fed8cf45288624889adad42cb35.tar.gz
Use TLS for the PyThreadState pointer instead of a field on Connection; this allows a Connection to be used safely in multiple threads concurrently
Diffstat (limited to 'leakcheck')
-rw-r--r--leakcheck/dhparam.pem4
-rw-r--r--leakcheck/thread-crash.py70
2 files changed, 74 insertions, 0 deletions
diff --git a/leakcheck/dhparam.pem b/leakcheck/dhparam.pem
new file mode 100644
index 0000000..9d33a4a
--- /dev/null
+++ b/leakcheck/dhparam.pem
@@ -0,0 +1,4 @@
+-----BEGIN DH PARAMETERS-----
+MEYCQQDM2LbvAjF5ahXHOUdDR09Vw/7kxjF/euWhNKBqUQQYT7FDSAMCCMq+Jhno
+BKxWEDhlxR1Q1VZ4H/NVTAGtWai7AgEC
+-----END DH PARAMETERS-----
diff --git a/leakcheck/thread-crash.py b/leakcheck/thread-crash.py
new file mode 100644
index 0000000..26048a5
--- /dev/null
+++ b/leakcheck/thread-crash.py
@@ -0,0 +1,70 @@
+# Copyright (C) Jean-Paul Calderone 2008, All rights reserved
+#
+# Stress tester for thread-related bugs in ssl_Connection_send and
+# ssl_Connection_recv in src/ssl/connection.c for usage of a single
+# Connection object simultaneously in multiple threads. In 0.7 and earlier,
+# this will somewhat reliably cause Python to abort with a "tstate mix-up"
+# almost immediately, due to the incorrect sharing between threads of the
+# `tstate` field of the connection object.
+
+
+from socket import socket
+from threading import Thread
+
+from OpenSSL.SSL import Connection, Context, TLSv1_METHOD
+
+def send(conn):
+ while 1:
+ for i in xrange(1024 * 32):
+ conn.send('x')
+ print 'Sent 32KB on', hex(id(conn))
+
+
+def recv(conn):
+ while 1:
+ for i in xrange(1024 * 64):
+ conn.recv(1)
+ print 'Received 64KB on', hex(id(conn))
+
+
+def main():
+ port = socket()
+ port.bind(('', 0))
+ port.listen(5)
+
+ client = socket()
+ client.setblocking(False)
+ client.connect_ex(port.getsockname())
+ client.setblocking(True)
+
+ server = port.accept()[0]
+
+ clientCtx = Context(TLSv1_METHOD)
+ clientCtx.set_cipher_list('ALL:ADH')
+ clientCtx.load_tmp_dh('dhparam.pem')
+
+ sslClient = Connection(clientCtx, client)
+ sslClient.set_connect_state()
+
+ serverCtx = Context(TLSv1_METHOD)
+ serverCtx.set_cipher_list('ALL:ADH')
+ serverCtx.load_tmp_dh('dhparam.pem')
+
+ sslServer = Connection(serverCtx, server)
+ sslServer.set_accept_state()
+
+ t1 = Thread(target=send, args=(sslClient,))
+ t2 = Thread(target=send, args=(sslServer,))
+ t3 = Thread(target=recv, args=(sslClient,))
+ t4 = Thread(target=recv, args=(sslServer,))
+
+ t1.start()
+ t2.start()
+ t3.start()
+ t4.start()
+ t1.join()
+ t2.join()
+ t3.join()
+ t4.join()
+
+main()