src/share/native/sun/security/ec/ECC_JNI.cpp
Print this page
@@ -60,12 +60,13 @@
SECITEM_FreeItem(&ecparams->curve.seed, B_FALSE);
SECITEM_FreeItem(&ecparams->base, B_FALSE);
SECITEM_FreeItem(&ecparams->order, B_FALSE);
SECITEM_FreeItem(&ecparams->DEREncoding, B_FALSE);
SECITEM_FreeItem(&ecparams->curveOID, B_FALSE);
- if (freeStruct)
- free(ecparams);
+ if (freeStruct) {
+ PORT_ZFree(ecparams, sizeof(ECParams));
+ }
}
/*
* Class: sun_security_ec_ECKeyPairGenerator
* Method: generateECKeyPair
@@ -137,13 +138,15 @@
if (ecparams)
FreeECParams(ecparams, true);
if (privKey) {
- FreeECParams(&privKey->ecParams, false);
SECITEM_FreeItem(&privKey->version, B_FALSE);
- // Don't free privKey->privateValue and privKey->publicValue
+ // Don't free privKey->privateValue and privKey->publicValue.
+ // Also, don't free privKey->ecParams, because it contains our only
+ // link to the arena. If this code is ever migrated to use arenas,
+ // then we will need to free it later.
}
if (pSeedBuffer)
delete [] pSeedBuffer;
}
@@ -151,10 +154,35 @@
return result;
}
/*
* Class: sun_security_ec_ECKeyPairGenerator
+ * Method: releaseECKeyPairData
+ * Signature: (JJ)V
+ */
+JNIEXPORT void
+JNICALL Java_sun_security_ec_ECKeyPairGenerator_releaseECKeyPairData
+ (JNIEnv *env, jclass clazz, jlong pk) {
+ ECPrivateKey *privKey = reinterpret_cast<ECPrivateKey *>(pk);
+ if (privKey) {
+ PRArenaPool *arena = privKey->ecParams.arena;
+
+ FreeECParams(&privKey->ecParams, false);
+ SECITEM_FreeItem(&privKey->privateValue, B_FALSE);
+ SECITEM_FreeItem(&privKey->publicValue, B_FALSE);
+
+ // In principle, we should just be able to free the arena.
+ // We add ZFree here because the JDK's FreeArena is currently a nop.
+ PORT_ZFree(privKey, sizeof(ECPrivateKey));
+ if (arena) {
+ PORT_FreeArena(arena, B_TRUE);
+ }
+ }
+}
+
+/*
+ * Class: sun_security_ec_ECKeyPairGenerator
* Method: getEncodedBytes
* Signature: (J)[B
*/
JNIEXPORT jbyteArray
JNICALL Java_sun_security_ec_ECKeyPairGenerator_getEncodedBytes