72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
# Copyright (C) Jean-Paul Calderone
|
|
# See LICENSE for details.
|
|
#
|
|
# 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()
|