summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--leakcheck/crypto.py59
-rw-r--r--src/crypto/x509.c2
3 files changed, 63 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index f783f71..098bd72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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\