src/share/native/sun/security/ec/ECC_JNI.cpp
Print this page
*** 60,71 ****
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);
}
/*
* Class: sun_security_ec_ECKeyPairGenerator
* Method: generateECKeyPair
--- 60,72 ----
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) {
! PORT_ZFree(ecparams, sizeof(ECParams));
! }
}
/*
* Class: sun_security_ec_ECKeyPairGenerator
* Method: generateECKeyPair
*** 137,149 ****
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
}
if (pSeedBuffer)
delete [] pSeedBuffer;
}
--- 138,152 ----
if (ecparams)
FreeECParams(ecparams, true);
if (privKey) {
SECITEM_FreeItem(&privKey->version, B_FALSE);
! // 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,160 ****
--- 154,188 ----
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