diff options
Diffstat (limited to 'leakcheck/thread-crash.py')
-rw-r--r-- | leakcheck/thread-crash.py | 70 |
1 files changed, 70 insertions, 0 deletions
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() |