Code Review Request for 7107613, 7107616, 7185471

Xuelei Fan xuelei.fan at oracle.com
Thu Jul 26 12:54:52 UTC 2012


On 7/26/2012 8:21 AM, Valerie (Yu-Ching) Peng wrote:
> Hi, Max or Xuelei,
> 
> Either of you have cycles to review the following 3 perf related fixes?
> 7107613: scalability bloker in javax.crypto.CryptoPermissions
> 7107616: scalability bloker in javax.crypto.JceSecurityManager
> 7185471: Avoid key expansion when AES cipher is re-init w/ the same key
> 
> Webrevs are at:
> http://cr.openjdk.java.net/~valeriep/7107613
In this update, the filed "perms" was declared as transient:
----------
-    private Hashtable<String, PermissionCollection> perms;
+    private transient ConcurrentHashMap<String,PermissionCollection> perms;
----------

The ObjectOutputStream.PutField and ObjectInputStream.GetField will call:
----------
+        Hashtable<String,PermissionCollection> permTable =
+            (Hashtable<String,PermissionCollection>)
(fields.get("perms", null));

+        Hashtable<String,PermissionCollection> permTable =
+            (Hashtable<String,PermissionCollection>)
(fields.get("perms", null));
----------

As will try to get the field offset of "perms" from the instance of this
class, CryptoPermissions. Because "perms" has been declared as
transient, a exception is properly thrown,
java.lang.IllegalArgumentException: no such field perms with type class
java.lang.Object

I think we may need to override the "serialPersistentFields" of
ObjectStreamField, as [1][2]:

+    private static final ObjectStreamField[] serialPersistentFields = {
+        new ObjectStreamField("perms", Hashtable.class),
+    };
+
+    private void readObject(ObjectInputStream s)
+        throws IOException, ClassNotFoundException {
+   ...




Alternatively, I was wondering maybe we reserver the hashtable variable,
"perms", and add a new transient ConcurrentHashMap variable,
"transientPerms":
------------------
     private Hashtable<String, PermissionCollection> perms;
+    private transient
+        ConcurrentHashMap<String,PermissionCollection> transientPerms;
------------------

Then we will not need to override the serialPersistentFields variable
any more. The readObject and writeObject looks like:
------------------
+    private void readObject(ObjectInputStream s)
+        throws IOException, ClassNotFoundException {
+
+        s.defaultReadObject();
+        transientPerms = new ConcurrentHashMap<>(perms);
+        perms = null;
+    }
+
+    private void writeObject(ObjectOutputStream s) throws IOException {
+        perms = new Hashtable<>(transientPerms);
+        s.defaultWriteObject();
+        perms = null;
+    }
------------------


Xuelei

[1]
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/input.html#4936
[2]
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#3127

> http://cr.openjdk.java.net/~valeriep/7107616
> http://cr.openjdk.java.net/~valeriep/7185471
> 
> The changes are for JDK 8. May be backported to 7u later if necessary,
> Thanks,
> Valerie




More information about the security-dev mailing list