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