[Libreoffice-commits] core.git: Branch 'aoo/trunk' - ridljar/com

Damjan Jovanovic damjan at apache.org
Sun Aug 20 08:10:17 UTC 2017


 ridljar/com/sun/star/uno/UnoRuntime.java |   14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

New commits:
commit 6dd83d1c6c5c580d14ca3d0458be4020603ba118
Author: Damjan Jovanovic <damjan at apache.org>
Date:   Sun Aug 20 06:22:29 2017 +0000

    #i32546# - Java UnoRuntime.getUniqueKey/generateOid do not work reliably
    
    In the Java UNO bridge, UnoRuntime.generateOid() generated the
    object-specific part of the OID using java.lang.Object.hashCode(),
    which is only 32 bits long, and is commonly overriden and could thus
    return values from an even smaller range, so OID collisions were quite
    likely.
    
    This changes UnoRuntime.generateOid() to use 128 bit UUIDs for the
    object-specific part of the OID, and store these in an object => oid
    java.util.WeakHashMap, making OID collisions almost impossible.
    
    Patch by: me
    Suggested by: Stephan Bergmann (stephan dot bergmann dot secondary at
    googlemail dot com)

diff --git a/ridljar/com/sun/star/uno/UnoRuntime.java b/ridljar/com/sun/star/uno/UnoRuntime.java
index ff2f297edb47..42c618ba9201 100644
--- a/ridljar/com/sun/star/uno/UnoRuntime.java
+++ b/ridljar/com/sun/star/uno/UnoRuntime.java
@@ -28,6 +28,8 @@ import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.UUID;
+import java.util.WeakHashMap;
 import com.sun.star.lib.uno.typedesc.TypeDescription;
 import com.sun.star.lib.util.WeakMap;
 
@@ -109,7 +111,16 @@ public class UnoRuntime {
         if (object instanceof IQueryInterface) {
             oid = ((IQueryInterface) object).getOid();
         }
-        return oid == null ? object.hashCode() + oidSuffix : oid;
+        if (oid == null) {
+            synchronized (oidMap) {
+                 oid = oidMap.get(object);
+                 if (oid == null) {
+                     oid = UUID.randomUUID().toString() + oidSuffix;
+                     oidMap.put(object, oid);
+                 }
+            }
+        }
+        return oid;
     }
 
     /**
@@ -677,6 +688,7 @@ public class UnoRuntime {
         private final IBridge bridge;
     }
 
+    private static final WeakHashMap<Object,String> oidMap = new WeakHashMap<Object,String>();
     private static final String uniqueKeyHostPrefix
     = Integer.toString(new Object().hashCode(), 16) + ":";
     private static final Object uniqueKeyLock = new Object();


More information about the Libreoffice-commits mailing list