r3098 - in trunk/libmikey: include/libmikey keyagreement

mikma at minisip.org mikma at minisip.org
Mon Jan 8 15:27:05 CET 2007


Author: mikma
Date: 2007-01-08 15:27:04 +0100 (Mon, 08 Jan 2007)
New Revision: 3098

Modified:
   trunk/libmikey/include/libmikey/keyagreement_dh.h
   trunk/libmikey/keyagreement/keyagreement_dh.cxx
Log:
Fix memory leaks in KeyAgreementDH

Modified: trunk/libmikey/include/libmikey/keyagreement_dh.h
===================================================================
--- trunk/libmikey/include/libmikey/keyagreement_dh.h	2007-01-08 14:20:45 UTC (rev 3097)
+++ trunk/libmikey/include/libmikey/keyagreement_dh.h	2007-01-08 14:27:04 UTC (rev 3098)
@@ -78,6 +78,8 @@
 		OakleyDH * dh;
 		byte_t * peerKeyPtr;
 		int peerKeyLengthValue;
+		byte_t * publicKeyPtr;
+		int publicKeyLengthValue;
 };
 
 class LIBMIKEY_API KeyAgreementDH : public KeyAgreement,

Modified: trunk/libmikey/keyagreement/keyagreement_dh.cxx
===================================================================
--- trunk/libmikey/keyagreement/keyagreement_dh.cxx	2007-01-08 14:20:45 UTC (rev 3097)
+++ trunk/libmikey/keyagreement/keyagreement_dh.cxx	2007-01-08 14:27:04 UTC (rev 3098)
@@ -59,7 +59,9 @@
 //
 KeyAgreementDHBase::KeyAgreementDHBase():
 	peerKeyPtr( NULL ),
-	peerKeyLengthValue( 0 )
+	peerKeyLengthValue( 0 ),
+	publicKeyPtr( NULL ),
+	publicKeyLengthValue( 0 )
 {
 	dh = new OakleyDH();
 	if( dh == NULL )
@@ -75,6 +77,10 @@
 		delete [] peerKeyPtr;
 		peerKeyPtr = NULL;
 	}
+	if( publicKeyPtr != NULL ){
+		delete [] publicKeyPtr;
+		publicKeyPtr = NULL;
+	}
 }
 
 // 
@@ -113,6 +119,16 @@
 		setTgk( NULL, len );
 	}
 
+	int32_t length = dh->publicKeyLength();
+	if( length != publicKeyLengthValue ){
+		if( publicKeyPtr ){
+			delete[] publicKeyPtr;
+		}
+		publicKeyLengthValue = length;
+		publicKeyPtr = new unsigned char[ length ];
+	}
+	dh->getPublicKey( publicKeyPtr, length );
+
 	return 0;
 }
 	
@@ -128,16 +144,11 @@
 }
 
 int KeyAgreementDHBase::publicKeyLength(){
-	return dh->publicKeyLength();
+	return publicKeyLengthValue;
 }
 
 unsigned char * KeyAgreementDHBase::publicKey(){
-	unsigned char * publicKey;
-	uint32_t length = publicKeyLength();
-	publicKey = new unsigned char[ length ];
-	dh->getPublicKey( publicKey, length );
-	return publicKey;
-
+	return publicKeyPtr;
 }
 
 int KeyAgreementDHBase::computeTgk(){
@@ -148,8 +159,10 @@
 }
 
 int KeyAgreementDHBase::group(){
+	if( !publicKeyPtr )
+		return -1;
+
 	return dh->group();
-
 }
 
 int KeyAgreementDHBase::peerKeyLength(){



More information about the Minisip-devel mailing list