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