diff --git a/.hgtags b/.hgtags index 8d11ae2f445700a9dad59ee3e27f41fd6a9efd8f..eeb8c0dfc177366c73b7878ffc3e3eec8dbeec8b 100644 --- a/.hgtags +++ b/.hgtags @@ -308,6 +308,7 @@ d723d05cd17afd5c4dd4293bcba83fef44a3c0bb jdk8u20-b16 5c0406ee9e820140b5322db006baed199c165b4f jdk8u20-b20 693025bbc45d683676fa78bb76201b665e0d8f2d jdk8u20-b21 0c2393744b29175de5204140d4dfbf12ca3d364f jdk8u20-b22 +be30cb2a3088f2b7b334b499f7eddbd5312312a7 jdk8u20-b23 abca9f6f1a10e9f91b2538bbe7870f54f550d986 jdk8u25-b00 7d0627679c9fdeaaaa9fe15c7cc11af0763621ec jdk8u25-b01 b0277ec994b751ebb761814675352506cd56bcd6 jdk8u25-b02 @@ -316,4 +317,5 @@ b0277ec994b751ebb761814675352506cd56bcd6 jdk8u25-b02 75b48287a1b3fc5757ac473f72c8918c7f345ffc jdk8u25-b05 5b80b4b22b4ca0b630c7f1cec3605da7694168e2 jdk8u25-b06 0e0a35b0bf0ff5852026c50038d5c2ecb26c075c jdk8u25-b07 +d7d221f56fd17b96bab4440448641a844f9e92cd jdk8u25-b08 f935349e2c065487c745bc41f81ddc7869bd2d2d jdk8u31-b00 diff --git a/src/share/classes/java/util/Collections.java b/src/share/classes/java/util/Collections.java index 83d4419e801b9e52c2634b1a840f8e87a12d3ee5..49124a47b0bf387377425473ac127993fee13f55 100644 --- a/src/share/classes/java/util/Collections.java +++ b/src/share/classes/java/util/Collections.java @@ -3031,9 +3031,11 @@ public class Collections { final Collection c; final Class type; - void typeCheck(Object o) { + @SuppressWarnings("unchecked") + E typeCheck(Object o) { if (o != null && !type.isInstance(o)) throw new ClassCastException(badElementMsg(o)); + return (E) o; } private String badElementMsg(Object o) { @@ -3042,10 +3044,8 @@ public class Collections { } CheckedCollection(Collection c, Class type) { - if (c==null || type == null) - throw new NullPointerException(); - this.c = c; - this.type = type; + this.c = Objects.requireNonNull(c, "c"); + this.type = Objects.requireNonNull(type, "type"); } public int size() { return c.size(); } @@ -3077,10 +3077,7 @@ public class Collections { public void remove() { it.remove(); }}; } - public boolean add(E e) { - typeCheck(e); - return c.add(e); - } + public boolean add(E e) { return c.add(typeCheck(e)); } private E[] zeroLengthElementArray; // Lazily initialized @@ -3091,7 +3088,7 @@ public class Collections { @SuppressWarnings("unchecked") Collection checkedCopyOf(Collection coll) { - Object[] a = null; + Object[] a; try { E[] z = zeroLengthElementArray(); a = coll.toArray(z); @@ -3187,11 +3184,7 @@ public class Collections { public E peek() {return queue.peek();} public E poll() {return queue.poll();} public E remove() {return queue.remove();} - - public boolean offer(E e) { - typeCheck(e); - return add(e); - } + public boolean offer(E e) {return queue.offer(typeCheck(e));} } /** @@ -3440,13 +3433,11 @@ public class Collections { public int lastIndexOf(Object o) { return list.lastIndexOf(o); } public E set(int index, E element) { - typeCheck(element); - return list.set(index, element); + return list.set(index, typeCheck(element)); } public void add(int index, E element) { - typeCheck(element); - list.add(index, element); + list.add(index, typeCheck(element)); } public boolean addAll(int index, Collection c) { @@ -3467,13 +3458,11 @@ public class Collections { public void remove() { i.remove(); } public void set(E e) { - typeCheck(e); - i.set(e); + i.set(typeCheck(e)); } public void add(E e) { - typeCheck(e); - i.add(e); + i.add(typeCheck(e)); } @Override @@ -3487,10 +3476,19 @@ public class Collections { return new CheckedList<>(list.subList(fromIndex, toIndex), type); } + /** + * {@inheritDoc} + * + * @throws ClassCastException if the class of an element returned by the + * operator prevents it from being added to this collection. The + * exception may be thrown after some elements of the list have + * already been replaced. + */ @Override public void replaceAll(UnaryOperator operator) { - list.replaceAll(operator); + list.replaceAll(e -> typeCheck(operator.apply(e))); } + @Override public void sort(Comparator c) { list.sort(c); diff --git a/src/share/classes/sun/security/smartcardio/CardImpl.java b/src/share/classes/sun/security/smartcardio/CardImpl.java index 322726f9c3515b2a9e35acbb8c44f8f0770d731b..7531d2eedaf7cb49674541180390e59f33e82ceb 100644 --- a/src/share/classes/sun/security/smartcardio/CardImpl.java +++ b/src/share/classes/sun/security/smartcardio/CardImpl.java @@ -237,7 +237,16 @@ final class CardImpl extends Card { } } + private static final boolean invertReset = + Boolean.parseBoolean( + java.security.AccessController.doPrivileged( + new sun.security.action.GetPropertyAction( + "sun.security.smartcardio.invertCardReset", "false"))); + public void disconnect(boolean reset) throws CardException { + if (invertReset) { + reset = !reset; + } if (reset) { checkSecurity("reset"); } diff --git a/test/java/util/Collections/CheckedListReplaceAll.java b/test/java/util/Collections/CheckedListReplaceAll.java new file mode 100644 index 0000000000000000000000000000000000000000..8ac05d095f2e3a95cfd52fd55389d690f2f764e7 --- /dev/null +++ b/test/java/util/Collections/CheckedListReplaceAll.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8047795 + * @summary Ensure that replaceAll operator cannot add bad elements + * @author Mike Duigou + */ + +import java.util.*; +import java.util.function.UnaryOperator; + +public class CheckedListReplaceAll { + public static void main(String[] args) { + List unwrapped = Arrays.asList(new Object[]{1, 2, 3}); + List wrapped = Collections.checkedList(unwrapped, Integer.class); + + UnaryOperator evil = e -> (((int) e) % 2 != 0) ? e : "evil"; + + try { + wrapped.replaceAll(evil); + System.out.printf("Bwahaha! I have defeated you! %s\n", wrapped); + throw new RuntimeException("String added to checked List"); + } catch (ClassCastException thwarted) { + thwarted.printStackTrace(System.out); + System.out.println("Curses! Foiled again!"); + } + } +} diff --git a/test/java/util/Collections/CheckedMapReplaceAll.java b/test/java/util/Collections/CheckedMapReplaceAll.java new file mode 100644 index 0000000000000000000000000000000000000000..05c4da3ad5edb40120e6cb1ef1b5734c7cb1cf0b --- /dev/null +++ b/test/java/util/Collections/CheckedMapReplaceAll.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8047795 + * @summary Ensure that replaceAll operator cannot add bad elements + * @author Mike Duigou + */ + +import java.util.*; +import java.util.function.BiFunction; + +public class CheckedMapReplaceAll { + public static void main(String[] args) { + Map unwrapped = new HashMap<>(); + unwrapped.put(1, 1.0); + unwrapped.put(2, 2.0); + unwrapped.put(3, 3.0); + + Map wrapped = Collections.checkedMap(unwrapped, Integer.class, Double.class); + + BiFunction evil = (k, v) -> (((int)k) % 2 != 0) ? v : "evil"; + + try { + wrapped.replaceAll(evil); + System.out.printf("Bwahaha! I have defeated you! %s\n", wrapped); + throw new RuntimeException("String added to checked Map"); + } catch (ClassCastException thwarted) { + thwarted.printStackTrace(System.out); + System.out.println("Curses! Foiled again!"); + } + } +} diff --git a/test/java/util/Collections/CheckedQueue.java b/test/java/util/Collections/CheckedQueue.java index 6f28e12e9efabfd3cc2e742c8f76e99e54083752..fb47e2e5ca166e9bc52218292fd251a83f918f6e 100644 --- a/test/java/util/Collections/CheckedQueue.java +++ b/test/java/util/Collections/CheckedQueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,55 +23,40 @@ /* * @test - * @bug 5020931 + * @bug 5020931 8048207 * @summary Unit test for Collections.checkedQueue + * @run testng CheckedQueue */ -import java.lang.reflect.Method; import java.util.Collections; -import java.util.Iterator; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; -public class CheckedQueue { - static int status = 0; - - public static void main(String[] args) throws Exception { - new CheckedQueue(); - } +import org.testng.annotations.Test; +import static org.testng.Assert.fail; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertFalse; - public CheckedQueue() throws Exception { - run(); - } - private void run() throws Exception { - Method[] methods = this.getClass().getDeclaredMethods(); - - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; - String methodName = method.getName(); - - if (methodName.startsWith("test")) { - try { - Object obj = method.invoke(this, new Object[0]); - } catch(Exception e) { - throw new Exception(this.getClass().getName() + "." + - methodName + " test failed, test exception " - + "follows\n" + e.getCause()); - } - } - } - } +public class CheckedQueue { /** * This test adds items to a queue. */ - private void test00() { + @Test + public void testAdd() { int arrayLength = 10; - ArrayBlockingQueue abq = new ArrayBlockingQueue(arrayLength); + Queue abq = Collections.checkedQueue(new ArrayBlockingQueue<>(arrayLength), String.class); for (int i = 0; i < arrayLength; i++) { - abq.add(new String(Integer.toString(i))); + abq.add(Integer.toString(i)); + } + + try { + abq.add("full"); + } catch (IllegalStateException full) { + } } @@ -80,23 +65,17 @@ public class CheckedQueue { * {@code String}s gets the checked queue, and attempt to add an Integer to * the checked queue. */ - private void test01() throws Exception { + @Test(expectedExceptions = ClassCastException.class) + public void testAddFail1() { int arrayLength = 10; ArrayBlockingQueue abq = new ArrayBlockingQueue(arrayLength + 1); for (int i = 0; i < arrayLength; i++) { - abq.add(new String(Integer.toString(i))); + abq.add(Integer.toString(i)); } Queue q = Collections.checkedQueue(abq, String.class); - - try { - q.add(new Integer(0)); - throw new Exception(this.getClass().getName() + "." + "test01 test" - + " failed, should throw ClassCastException."); - } catch(ClassCastException cce) { - // Do nothing. - } + q.add(0); } /** @@ -104,47 +83,40 @@ public class CheckedQueue { * {@code String}, gets the checked queue, and attempt to add an Integer to * the checked queue. */ - private void test02() throws Exception { + @Test(expectedExceptions = ClassCastException.class) + public void testAddFail2() { ArrayBlockingQueue abq = new ArrayBlockingQueue(1); Queue q = Collections.checkedQueue(abq, String.class); - try { - q.add(new Integer(0)); - throw new Exception(this.getClass().getName() + "." + "test02 test" - + " failed, should throw ClassCastException."); - } catch(ClassCastException e) { - // Do nothing. - } + q.add(0); } /** * This test tests the Collections.checkedQueue method call for nulls in * each and both of the parameters. */ - private void test03() throws Exception { + @Test + public void testArgs() { ArrayBlockingQueue abq = new ArrayBlockingQueue(1); Queue q; try { q = Collections.checkedQueue(null, String.class); - throw new Exception(this.getClass().getName() + "." + "test03 test" - + " failed, should throw NullPointerException."); + fail( "should throw NullPointerException."); } catch(NullPointerException npe) { // Do nothing } try { q = Collections.checkedQueue(abq, null); - throw new Exception(this.getClass().getName() + "." + "test03 test" - + " failed, should throw NullPointerException."); + fail( "should throw NullPointerException."); } catch(Exception e) { // Do nothing } try { q = Collections.checkedQueue(null, null); - throw new Exception(this.getClass().getName() + "." + "test03 test" - + " failed, should throw NullPointerException."); + fail( "should throw NullPointerException."); } catch(Exception e) { // Do nothing } @@ -153,38 +125,28 @@ public class CheckedQueue { /** * This test tests the CheckedQueue.offer method. */ - private void test04() throws Exception { + @Test + public void testOffer() { ArrayBlockingQueue abq = new ArrayBlockingQueue(1); Queue q = Collections.checkedQueue(abq, String.class); try { q.offer(null); - throw new Exception(this.getClass().getName() + "." + "test04 test" - + " failed, should throw NullPointerException."); + fail("should throw NullPointerException."); } catch (NullPointerException npe) { // Do nothing } try { - q.offer(new Integer(0)); - throw new Exception(this.getClass().getName() + "." + "test04 test" - + " failed, should throw ClassCastException."); + q.offer(0); + fail("should throw ClassCastException."); } catch (ClassCastException cce) { // Do nothing } - q.offer(new String("0")); - - try { - q.offer(new String("1")); - throw new Exception(this.getClass().getName() + "." + "test04 test" - + " failed, should throw IllegalStateException."); - } catch(IllegalStateException ise) { - // Do nothing - } - } - - private void test05() { + assertTrue(q.offer("0"), "queue should have room"); + // no room at the inn! + assertFalse(q.offer("1"), "queue should be full"); } }