diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | leakcheck/crypto.py | 59 | ||||
-rw-r--r-- | src/crypto/x509.c | 2 |
3 files changed, 63 insertions, 1 deletions
@@ -3,6 +3,9 @@ * src/ssl/context.c: Expose SSL_CTX_add_extra_chain_cert. * src/crypto/x509name.c: Fix memory leaks in __getattr__ and __setattr_ implementations. + * src/crypto/x509.c: Fix memory leak in X509.get_pubkey(). + * leakcheck/: An attempt at a systematic approach to leak + elimination. 2004-08-13 Martin Sjögren <msjogren@gmail.com> diff --git a/leakcheck/crypto.py b/leakcheck/crypto.py new file mode 100644 index 0000000..eb00182 --- /dev/null +++ b/leakcheck/crypto.py @@ -0,0 +1,59 @@ +import sys + +from OpenSSL.crypto import TYPE_DSA, Error, PKey, X509 + +class Checker_X509_get_pubkey(object): + """ + Leak checks for L{X509.get_pubkey}. + """ + def __init__(self, iterations): + self.iterations = iterations + + + def check_exception(self): + """ + Call the method repeatedly such that it will raise an exception. + """ + for i in xrange(self.iterations): + cert = X509() + try: + cert.get_pubkey() + except Error: + pass + + + def check_success(self): + """ + Call the method repeatedly such that it will return a PKey object. + """ + small = xrange(3) + for i in xrange(self.iterations): + key = PKey() + key.generate_key(TYPE_DSA, 256) + for i in small: + cert = X509() + cert.set_pubkey(key) + for i in small: + cert.get_pubkey() + + +def vmsize(): + return [x for x in file('/proc/self/status').readlines() if 'VmSize' in x] + + +def main(iterations='1000'): + iterations = int(iterations) + for klass in globals(): + if klass.startswith('Checker_'): + klass = globals()[klass] + print klass + checker = klass(iterations) + for meth in dir(checker): + if meth.startswith('check_'): + print '\t', meth, vmsize(), '...', + getattr(checker, meth)() + print vmsize() + + +if __name__ == '__main__': + main(*sys.argv[1:]) diff --git a/src/crypto/x509.c b/src/crypto/x509.c index bcae5f6..13a4c71 100644 --- a/src/crypto/x509.c +++ b/src/crypto/x509.c @@ -235,7 +235,7 @@ crypto_X509_get_pubkey(crypto_X509Obj *self, PyObject *args) return NULL; } - return (PyObject *)crypto_PKey_New(pkey, 0); + return (PyObject *)crypto_PKey_New(pkey, 1); } static char crypto_X509_set_pubkey_doc[] = "\n\ |