r3095 - in trunk/libmcrypto/source: . gnutls

mikma at minisip.org mikma at minisip.org
Sun Jan 7 16:29:48 CET 2007


Author: mikma
Date: 2007-01-07 16:29:47 +0100 (Sun, 07 Jan 2007)
New Revision: 3095

Modified:
   trunk/libmcrypto/source/cert.cxx
   trunk/libmcrypto/source/gnutls/cert.cxx
Log:
* Fix leaks in ca_db.
* Make a copy of GNU TLS certificates before storing it in the CA db.


Modified: trunk/libmcrypto/source/cert.cxx
===================================================================
--- trunk/libmcrypto/source/cert.cxx	2007-01-07 14:44:34 UTC (rev 3094)
+++ trunk/libmcrypto/source/cert.cxx	2007-01-07 15:29:47 UTC (rev 3095)
@@ -116,6 +116,13 @@
 }
 
 ca_db::~ca_db(){
+	std::list<ca_db_item *>::iterator i;
+	std::list<ca_db_item *>::iterator last = items.end();
+
+	for( i = items.begin(); i != last; i++ ){
+		ca_db_item* item = *i;
+		delete item;
+	}
 }
 
 void ca_db::lock(){

Modified: trunk/libmcrypto/source/gnutls/cert.cxx
===================================================================
--- trunk/libmcrypto/source/gnutls/cert.cxx	2007-01-07 14:44:34 UTC (rev 3094)
+++ trunk/libmcrypto/source/gnutls/cert.cxx	2007-01-07 15:29:47 UTC (rev 3095)
@@ -946,6 +946,11 @@
 
 gtls_ca_db_item::~gtls_ca_db_item(){
 	if( certs ){
+		for( unsigned int i=0; i < num_certs; i++ ){
+			gnutls_x509_crt_deinit( certs[i] );
+			certs[i] = NULL;
+		}
+
 		delete[] certs;
 		certs = NULL;
 		num_certs = 0;
@@ -1164,7 +1169,31 @@
 	item->type = CERT_DB_ITEM_TYPE_OTHER;
 	item->num_certs = 1;
 	item->certs = new gnutls_x509_crt_t[item->num_certs];
-	item->certs[0] = dynamic_cast<gtls_certificate*>(cert)->get_certificate();
+	item->certs[0] = NULL;
+
+	int ret = gnutls_x509_crt_init( &item->certs[0] );
+
+	if( ret != 0 ){
+		throw certificate_exception_init( 
+		 	"Could not initialize the certificate structure" );
+	}
+        
+	gnutls_datum der;
+
+	der.size = cert->get_der_length();
+	der.data = new byte_t[ der.size ];
+	cert->get_der( der.data, &der.size );
+
+	ret = gnutls_x509_crt_import( item->certs[0], &der, GNUTLS_X509_FMT_DER );
+
+	delete[] der.data;
+	der.data = NULL;
+
+	if( ret != 0 ){
+	 	throw certificate_exception( 
+		 	"Could not import the given certificate" );
+	}
+
 	return item;
 }
 



More information about the Minisip-devel mailing list