summaryrefslogtreecommitdiff
path: root/java/openjdk6/files/icedtea/security/20130416/8009063.patch
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2013-04-25 20:03:56 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2013-04-25 20:03:56 +0000
commit70c842246a7ffdd808630db4af137711eaa33346 (patch)
treefaaadf11511ea057e94e662bbf56a70751cbbbec /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.patch67
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);
+ }