diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2013-04-25 20:03:56 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2013-04-25 20:03:56 +0000 |
commit | 70c842246a7ffdd808630db4af137711eaa33346 (patch) | |
tree | faaadf11511ea057e94e662bbf56a70751cbbbec /java/openjdk6/files/icedtea/security/20130416/8009063.patch | |
parent | - Update to 2.0.6 . (diff) |
Add multiple security patches from IcedTea6 1.12.5.
http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2013-April/022985.html
Obtained from: IcedTea Project
Diffstat (limited to 'java/openjdk6/files/icedtea/security/20130416/8009063.patch')
-rw-r--r-- | java/openjdk6/files/icedtea/security/20130416/8009063.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea/security/20130416/8009063.patch b/java/openjdk6/files/icedtea/security/20130416/8009063.patch new file mode 100644 index 000000000000..a15331af4bbc --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8009063.patch @@ -0,0 +1,67 @@ +# HG changeset patch +# User chegar +# Date 1362305505 0 +# Node ID 98ad2f1e25d13aca196ad77b2f227f85072c9b16 +# Parent 17ac71e7b72087f0f7b7ac793ae93a816ef22d96 +8009063: Improve reliability of ConcurrentHashMap +Reviewed-by: alanb, ahgross + +diff --git a/src/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/share/classes/java/util/concurrent/ConcurrentHashMap.java +--- jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java ++++ jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java +@@ -40,6 +40,7 @@ import java.io.IOException; + import java.io.IOException; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; ++import java.io.ObjectStreamField; + + /** + * A hash table supporting full concurrency of retrievals and +@@ -1535,7 +1536,23 @@ public class ConcurrentHashMap<K, V> ext + @SuppressWarnings("unchecked") + private void readObject(java.io.ObjectInputStream s) + throws IOException, ClassNotFoundException { +- s.defaultReadObject(); ++ // Don't call defaultReadObject() ++ ObjectInputStream.GetField oisFields = s.readFields(); ++ final Segment<K,V>[] oisSegments = (Segment<K,V>[])oisFields.get("segments", null); ++ ++ final int ssize = oisSegments.length; ++ if (ssize < 1 || ssize > MAX_SEGMENTS ++ || (ssize & (ssize-1)) != 0 ) // ssize not power of two ++ throw new java.io.InvalidObjectException("Bad number of segments:" ++ + ssize); ++ int sshift = 0, ssizeTmp = ssize; ++ while (ssizeTmp > 1) { ++ ++sshift; ++ ssizeTmp >>>= 1; ++ } ++ UNSAFE.putIntVolatile(this, SEGSHIFT_OFFSET, 32 - sshift); ++ UNSAFE.putIntVolatile(this, SEGMASK_OFFSET, ssize - 1); ++ UNSAFE.putObjectVolatile(this, SEGMENTS_OFFSET, oisSegments); + + // set hashMask + UNSAFE.putIntVolatile(this, HASHSEED_OFFSET, randomHashSeed(this)); +@@ -1568,6 +1585,9 @@ public class ConcurrentHashMap<K, V> ext + private static final int SSHIFT; + private static final long TBASE; + private static final int TSHIFT; ++ private static final long SEGSHIFT_OFFSET; ++ private static final long SEGMASK_OFFSET; ++ private static final long SEGMENTS_OFFSET; + + static { + int ss, ts; +@@ -1581,6 +1601,12 @@ public class ConcurrentHashMap<K, V> ext + SBASE = UNSAFE.arrayBaseOffset(sc); + ts = UNSAFE.arrayIndexScale(tc); + ss = UNSAFE.arrayIndexScale(sc); ++ SEGSHIFT_OFFSET = UNSAFE.objectFieldOffset( ++ ConcurrentHashMap.class.getDeclaredField("segmentShift")); ++ SEGMASK_OFFSET = UNSAFE.objectFieldOffset( ++ ConcurrentHashMap.class.getDeclaredField("segmentMask")); ++ SEGMENTS_OFFSET = UNSAFE.objectFieldOffset( ++ ConcurrentHashMap.class.getDeclaredField("segments")); + } catch (Exception e) { + throw new Error(e); + } |