diff options
author | Milan Crha <mcrha@redhat.com> | 2009-12-15 18:12:41 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2009-12-15 18:12:41 +0800 |
commit | 859c8b5a8fae36bdb615f35f792c8256d4c8f97e (patch) | |
tree | 020d25459a72882a3406d3f4f28641e72e9ceda9 /smime/lib/e-cert.c | |
parent | c0c247128c71653e38c6a5de900a069e13a53d8e (diff) | |
download | gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.tar gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.tar.gz gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.tar.bz2 gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.tar.lz gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.tar.xz gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.tar.zst gsoc2013-evolution-859c8b5a8fae36bdb615f35f792c8256d4c8f97e.zip |
Bug #603342 - Memory leak fixes
Diffstat (limited to 'smime/lib/e-cert.c')
-rw-r--r-- | smime/lib/e-cert.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/smime/lib/e-cert.c b/smime/lib/e-cert.c index 2591678cec..db4104859e 100644 --- a/smime/lib/e-cert.c +++ b/smime/lib/e-cert.c @@ -140,6 +140,11 @@ e_cert_dispose (GObject *object) } } + if (ec->priv->cert) { + CERT_DestroyCertificate (ec->priv->cert); + ec->priv->cert = NULL; + } + g_free (ec->priv); ec->priv = NULL; @@ -257,6 +262,7 @@ e_cert_new (CERTCertificate *cert) { ECert *ecert = E_CERT (g_object_new (E_TYPE_CERT, NULL)); + /* ECert owns a reference to the 'cert', which will be freed on ECert finalize */ ecert->priv->cert = cert; e_cert_populate (ecert); @@ -468,6 +474,8 @@ e_cert_get_chain (ECert *ecert) next_cert = CERT_FindCertIssuer (cert, PR_Now(), certUsageSSLClient); if (!next_cert) break; + + /* next_cert has a reference already */ ecert = e_cert_new (next_cert); } @@ -477,14 +485,19 @@ e_cert_get_chain (ECert *ecert) ECert * e_cert_get_ca_cert(ECert *ecert) { - CERTCertificate *cert, *next = e_cert_get_internal_cert(ecert); + CERTCertificate *cert, *next = e_cert_get_internal_cert(ecert), *internal; + cert = next; + internal = cert; do { + if (cert != next && cert != internal) + CERT_DestroyCertificate (cert); + cert = next; next = CERT_FindCertIssuer (cert, PR_Now(), certUsageAnyCA); } while (next && next != cert); - if (cert == e_cert_get_internal_cert(ecert)) + if (cert == internal) return g_object_ref(ecert); else return e_cert_new(cert); |