| # Copyright (C) Jean-Paul Calderone | |
| # See LICENSE for details. | |
| # | |
| # Stress tester for thread-related bugs in global_passphrase_callback in | |
| # src/ssl/context.c. In 0.7 and earlier, this will somewhat reliably | |
| # segfault or abort after a few dozen to a few thousand iterations on an SMP | |
| # machine (generally not on a UP machine) due to uses of Python/C API | |
| # without holding the GIL. | |
| from itertools import count | |
| from threading import Thread | |
| from OpenSSL.SSL import Context, TLSv1_METHOD | |
| from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM, PKey, dump_privatekey | |
| k = PKey() | |
| k.generate_key(TYPE_RSA, 128) | |
| file('pkey.pem', 'w').write(dump_privatekey(FILETYPE_PEM, k, "blowfish", "foobar")) | |
| count = count() | |
| def go(): | |
| def cb(a, b, c): | |
| print count.next() | |
| return "foobar" | |
| c = Context(TLSv1_METHOD) | |
| c.set_passwd_cb(cb) | |
| while 1: | |
| c.use_privatekey_file('pkey.pem') | |
| threads = [Thread(target=go, args=()) for i in xrange(2)] | |
| for th in threads: | |
| th.start() | |
| for th in threads: | |
| th.join() |