From 889c7947a6e832cf32d2aa4a47e6100204354144 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Thu, 14 Oct 2010 15:25:57 +0200 Subject: [PATCH] Avoid duplicate certificates in mem_cred_t. --- src/libstrongswan/credentials/sets/mem_cred.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/libstrongswan/credentials/sets/mem_cred.c b/src/libstrongswan/credentials/sets/mem_cred.c index cabbdaec7..68ad1f1dd 100644 --- a/src/libstrongswan/credentials/sets/mem_cred.c +++ b/src/libstrongswan/credentials/sets/mem_cred.c @@ -139,15 +139,25 @@ METHOD(credential_set_t, create_cert_enumerator, enumerator_t*, (void*)cert_data_destroy); } +static bool certificate_equals(certificate_t *item, certificate_t *cert) +{ + return item->equals(item, cert); +} + METHOD(mem_cred_t, add_cert, void, private_mem_cred_t *this, bool trusted, certificate_t *cert) { this->lock->write_lock(this->lock); - if (trusted) + if (this->untrusted->find_last(this->untrusted, + (linked_list_match_t)certificate_equals, NULL, cert) != SUCCESS) { - this->trusted->insert_last(this->trusted, cert->get_ref(cert)); + if (trusted) + { + this->trusted->insert_last(this->trusted, cert->get_ref(cert)); + } + this->untrusted->insert_last(this->untrusted, cert->get_ref(cert)); } - this->untrusted->insert_last(this->untrusted, cert); + cert->destroy(cert); this->lock->unlock(this->lock); }