diff options
author | Jean-Paul Calderone <exarkun@boson> | 2008-09-21 17:42:34 -0400 |
---|---|---|
committer | Jean-Paul Calderone <exarkun@boson> | 2008-09-21 17:42:34 -0400 |
commit | 00db9daab0b42fed8cf45288624889adad42cb35 (patch) | |
tree | 542d11a6cb43d0d2b4ddc6adec220c1eed7c56e5 /leakcheck | |
parent | f1b839dccf33b12f9100ffa91d45b4d1b9167adf (diff) | |
download | pyopenssl-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.pem | 4 | ||||
-rw-r--r-- | leakcheck/thread-crash.py | 70 |
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() |