undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
This commit is contained in:
commit
0a580b313d
70422 changed files with 17213626 additions and 0 deletions
219
test/jdk/java/util/Vector/ArrayManagement.java
Normal file
219
test/jdk/java/util/Vector/ArrayManagement.java
Normal file
|
|
@ -0,0 +1,219 @@
|
|||
/*
|
||||
* Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright 2016 Google, Inc. 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 8148174
|
||||
* @summary brittle white box test of internal array management
|
||||
* @run junit ArrayManagement
|
||||
*/
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.AbstractList;
|
||||
import java.util.Vector;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.SplittableRandom;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class ArrayManagement {
|
||||
|
||||
/**
|
||||
* A Vector that exposes all protected elements, and checks class
|
||||
* invariants.
|
||||
*/
|
||||
static class PublicVector<E> extends Vector<E> {
|
||||
public PublicVector() { super(); }
|
||||
public PublicVector(int capacity) { super(capacity); }
|
||||
public PublicVector(int capacity, int capacityIncrement) {
|
||||
super(capacity, capacityIncrement);
|
||||
}
|
||||
public Object[] elementData() { return elementData; }
|
||||
public int modCount() { return modCount; }
|
||||
public int capacityIncrement() { return capacityIncrement; }
|
||||
public int capacity() { return elementData.length; }
|
||||
|
||||
public void ensureCapacity(int minCapacity) {
|
||||
int oldCapacity = capacity();
|
||||
int oldModCount = modCount();
|
||||
super.ensureCapacity(minCapacity);
|
||||
assertTrue(capacity() >= minCapacity);
|
||||
if (minCapacity <= oldCapacity)
|
||||
assertEquals(oldCapacity, capacity());
|
||||
if (minCapacity > 0)
|
||||
assertEquals(oldModCount + 1, modCount());
|
||||
}
|
||||
}
|
||||
|
||||
static final int DEFAULT_CAPACITY = 10;
|
||||
static final SplittableRandom rnd = new SplittableRandom();
|
||||
|
||||
static int newCapacity(int oldCapacity) {
|
||||
return 2 * oldCapacity;
|
||||
}
|
||||
|
||||
static List<Object> singletonList() {
|
||||
return Collections.singletonList(Boolean.TRUE);
|
||||
}
|
||||
|
||||
/** Opportunistically randomly test various add operations. */
|
||||
static void addOneElement(PublicVector<Object> list) {
|
||||
int size = list.size();
|
||||
int modCount = list.modCount();
|
||||
switch (rnd.nextInt(4)) {
|
||||
case 0: assertTrue(list.add(Boolean.TRUE)); break;
|
||||
case 1: list.add(size, Boolean.TRUE); break;
|
||||
case 2: assertTrue(list.addAll(singletonList())); break;
|
||||
case 3: assertTrue(list.addAll(size, singletonList())); break;
|
||||
default: throw new AssertionError();
|
||||
}
|
||||
assertEquals(modCount + 1, list.modCount());
|
||||
assertEquals(size + 1, list.size());
|
||||
}
|
||||
|
||||
@Test public void defaultCapacity() {
|
||||
PublicVector<Object> list = new PublicVector<>();
|
||||
assertEquals(DEFAULT_CAPACITY, new PublicVector<Object>().capacity());
|
||||
for (int i = 0; i < DEFAULT_CAPACITY; i++) {
|
||||
addOneElement(list);
|
||||
assertEquals(DEFAULT_CAPACITY, list.capacity());
|
||||
}
|
||||
addOneElement(list);
|
||||
assertEquals(newCapacity(DEFAULT_CAPACITY), list.capacity());
|
||||
}
|
||||
|
||||
@Test public void defaultCapacityEnsureCapacity() {
|
||||
PublicVector<Object> list = new PublicVector<>();
|
||||
for (int i = 0; i <= DEFAULT_CAPACITY; i++) {
|
||||
list.ensureCapacity(i); // no-op!
|
||||
assertEquals(DEFAULT_CAPACITY, list.capacity());
|
||||
}
|
||||
for (int i = 0; i < DEFAULT_CAPACITY; i++) {
|
||||
addOneElement(list);
|
||||
assertEquals(DEFAULT_CAPACITY, list.capacity());
|
||||
}
|
||||
addOneElement(list);
|
||||
assertEquals(newCapacity(DEFAULT_CAPACITY), list.capacity());
|
||||
{
|
||||
int capacity = list.capacity();
|
||||
list.ensureCapacity(capacity + 1);
|
||||
assertEquals(newCapacity(capacity), list.capacity());
|
||||
}
|
||||
{
|
||||
int capacity = list.capacity();
|
||||
list.ensureCapacity(3 * capacity);
|
||||
assertEquals(3 * capacity, list.capacity());
|
||||
}
|
||||
}
|
||||
|
||||
@Test public void ensureCapacityBeyondDefaultCapacity() {
|
||||
PublicVector<Object> list = new PublicVector<>();
|
||||
list.ensureCapacity(DEFAULT_CAPACITY + 1);
|
||||
assertEquals(newCapacity(DEFAULT_CAPACITY), list.capacity());
|
||||
}
|
||||
|
||||
@Test public void explicitZeroCapacity() {
|
||||
PublicVector<Object> list = new PublicVector<>(0);
|
||||
assertEquals(0, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(1, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(2, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(4, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(4, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(8, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(8, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(8, list.capacity());
|
||||
list.clear();
|
||||
assertEquals(8, list.capacity());
|
||||
}
|
||||
|
||||
@Test public void explicitZeroCapacityWithCapacityIncrement() {
|
||||
PublicVector<Object> list = new PublicVector<>(0, 2);
|
||||
assertEquals(0, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(2, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(2, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(4, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(4, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(6, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(6, list.capacity());
|
||||
addOneElement(list);
|
||||
assertEquals(8, list.capacity());
|
||||
list.clear();
|
||||
assertEquals(8, list.capacity());
|
||||
}
|
||||
|
||||
@Test public void explicitLargeCapacity() {
|
||||
int n = DEFAULT_CAPACITY * 3;
|
||||
PublicVector<Object> list = new PublicVector<>(n);
|
||||
assertEquals(n, list.capacity());
|
||||
list.ensureCapacity(0);
|
||||
list.ensureCapacity(n);
|
||||
for (int i = 0; i < n; i++) addOneElement(list);
|
||||
assertEquals(n, list.capacity());
|
||||
|
||||
addOneElement(list);
|
||||
assertEquals(newCapacity(n), list.capacity());
|
||||
}
|
||||
|
||||
@Test public void explicitLargeCapacityWithCapacityIncrement() {
|
||||
int n = DEFAULT_CAPACITY * 3;
|
||||
PublicVector<Object> list = new PublicVector<>(n, 2);
|
||||
assertEquals(n, list.capacity());
|
||||
list.ensureCapacity(0);
|
||||
list.ensureCapacity(n);
|
||||
for (int i = 0; i < n; i++) addOneElement(list);
|
||||
assertEquals(n, list.capacity());
|
||||
|
||||
addOneElement(list);
|
||||
assertEquals(n + 2, list.capacity());
|
||||
}
|
||||
|
||||
@Test public void emptyArraysAreNotShared() {
|
||||
assertNotSame(new PublicVector<Object>(0).elementData(),
|
||||
new PublicVector<Object>(0).elementData());
|
||||
}
|
||||
|
||||
@Test public void negativeCapacity() {
|
||||
for (int capacity : new int[] { -1, Integer.MIN_VALUE }) {
|
||||
try {
|
||||
new Vector<Object>(capacity);
|
||||
fail("should throw");
|
||||
} catch (IllegalArgumentException success) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
43
test/jdk/java/util/Vector/Bug8148174.java
Normal file
43
test/jdk/java/util/Vector/Bug8148174.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright 2016 Google, Inc. 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 8148174
|
||||
* @summary repro for: NegativeArraySizeException in Vector.grow(int)
|
||||
* @run main/manual/othervm -Xmx17g Bug8148174
|
||||
* @requires os.maxMemory>17G
|
||||
*/
|
||||
|
||||
public class Bug8148174 {
|
||||
public static void main(String[] args) {
|
||||
int size = Integer.MAX_VALUE - 2;
|
||||
java.util.Vector<Object> huge = new java.util.Vector<>(size);
|
||||
for (int i = 0; i < size; i++)
|
||||
huge.add(null);
|
||||
try {
|
||||
huge.addAll(huge);
|
||||
throw new Error("expected OutOfMemoryError not thrown");
|
||||
} catch (OutOfMemoryError success) {}
|
||||
}
|
||||
}
|
||||
50
test/jdk/java/util/Vector/ComodifiedRemoveAllElements.java
Normal file
50
test/jdk/java/util/Vector/ComodifiedRemoveAllElements.java
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 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 4298133
|
||||
* @summary Due to a bug in Vector's removeAllElements(),
|
||||
* the modification counter would not get incremented.
|
||||
* @author Konstantin Kladko
|
||||
*/
|
||||
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.Iterator;
|
||||
import java.util.Vector;
|
||||
|
||||
public class ComodifiedRemoveAllElements {
|
||||
public static void main(String[] args) {
|
||||
Vector v = new Vector();
|
||||
v.addElement(null);
|
||||
Iterator it = v.iterator();
|
||||
v.removeAllElements();
|
||||
try {
|
||||
it.next();
|
||||
} catch (ConcurrentModificationException cme) {
|
||||
return;
|
||||
}
|
||||
throw new RuntimeException(
|
||||
"Vector.RemoveAllElements() modCount increment failed.");
|
||||
}
|
||||
}
|
||||
59
test/jdk/java/util/Vector/CopyInto.java
Normal file
59
test/jdk/java/util/Vector/CopyInto.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* Copyright (c) 2005, 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 4936876
|
||||
* @summary Vector.copyInto should throw ArrayStoreException
|
||||
* @author Martin Buchholz
|
||||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
public class CopyInto {
|
||||
private static void realMain(String[] args) throws Throwable {
|
||||
try {
|
||||
Vector<String> v = new Vector<>();
|
||||
v.add("foo");
|
||||
v.copyInto(new Integer[3]);
|
||||
fail("Expected ArrayStoreException");
|
||||
}
|
||||
catch (ArrayStoreException e) { pass(); }
|
||||
catch (Throwable t) { unexpected(t); }
|
||||
}
|
||||
|
||||
//--------------------- Infrastructure ---------------------------
|
||||
static volatile int passed = 0, failed = 0;
|
||||
static void pass() {passed++;}
|
||||
static void fail() {failed++; Thread.dumpStack();}
|
||||
static void fail(String msg) {System.out.println(msg); fail();}
|
||||
static void unexpected(Throwable t) {failed++; t.printStackTrace();}
|
||||
static void check(boolean cond) {if (cond) pass(); else fail();}
|
||||
static void equal(Object x, Object y) {
|
||||
if (x == null ? y == null : x.equals(y)) pass();
|
||||
else fail(x + " not equal to " + y);}
|
||||
public static void main(String[] args) throws Throwable {
|
||||
try {realMain(args);} catch (Throwable t) {unexpected(t);}
|
||||
System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
|
||||
if (failed > 0) throw new AssertionError("Some tests failed");}
|
||||
}
|
||||
58
test/jdk/java/util/Vector/IllegalConstructorArgs.java
Normal file
58
test/jdk/java/util/Vector/IllegalConstructorArgs.java
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (c) 1997, 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 4061897
|
||||
* @summary Test for illegal argument exception
|
||||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* This is a simple test class created to check for
|
||||
* an exception when a new Vector is constructed with
|
||||
* illegal arguments
|
||||
*/
|
||||
public class IllegalConstructorArgs {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int testSucceeded=0;
|
||||
|
||||
try {
|
||||
// this should generate an IllegalArgumentException
|
||||
Vector bad1 = new Vector(-100, 10);
|
||||
}
|
||||
catch (IllegalArgumentException e1) {
|
||||
testSucceeded =1;
|
||||
}
|
||||
catch (NegativeArraySizeException e2) {
|
||||
testSucceeded =0;
|
||||
}
|
||||
|
||||
if (testSucceeded == 0)
|
||||
throw new RuntimeException("Wrong exception thrown.");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
43
test/jdk/java/util/Vector/LastIndexOf.java
Normal file
43
test/jdk/java/util/Vector/LastIndexOf.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright (c) 1999, 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 4271588
|
||||
* @summary Vector.lastIndex(Object, int) used to let you look outside the
|
||||
* valid range in the backing array
|
||||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
public class LastIndexOf {
|
||||
public static void main(String[] args) throws Exception {
|
||||
Vector v = new Vector(10);
|
||||
|
||||
try {
|
||||
int i = v.lastIndexOf(null, 5);
|
||||
throw new Exception("lastIndexOf(5/10) " + i);
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
157
test/jdk/java/util/Vector/SerializationDeadlock.java
Normal file
157
test/jdk/java/util/Vector/SerializationDeadlock.java
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
* Copyright (c) 2010, 2011, 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 2010, 2011 IBM Corporation
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6934356
|
||||
* @summary Serializing Vector objects which refer to each other should not be able to deadlock.
|
||||
* @author Neil Richards <neil.richards@ngmr.net>, <neil_richards@uk.ibm.com>
|
||||
*/
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
|
||||
public class SerializationDeadlock {
|
||||
public static void main(final String[] args) throws Exception {
|
||||
// Test for Vector serialization deadlock
|
||||
final Vector<Object> v1 = new Vector<>();
|
||||
final Vector<Object> v2 = new Vector<>();
|
||||
final TestBarrier testStart = new TestBarrier(3);
|
||||
|
||||
// Populate the vectors so that they refer to each other
|
||||
v1.add(testStart);
|
||||
v1.add(v2);
|
||||
v2.add(testStart);
|
||||
v2.add(v1);
|
||||
|
||||
final CyclicBarrier testEnd = new CyclicBarrier(3);
|
||||
final TestThread t1 = new TestThread(v1, testEnd);
|
||||
final TestThread t2 = new TestThread(v2, testEnd);
|
||||
|
||||
t1.start();
|
||||
t2.start();
|
||||
|
||||
// Wait for both test threads to have initiated serialization
|
||||
// of the 'testStart' object (and hence of both 'v1' and 'v2')
|
||||
testStart.await();
|
||||
|
||||
// Wait for both test threads to successfully finish serialization
|
||||
// of 'v1' and 'v2'.
|
||||
System.out.println("Waiting for Vector serialization to complete ...");
|
||||
System.out.println("(This test will hang if serialization deadlocks)");
|
||||
testEnd.await();
|
||||
System.out.println("Test PASSED: serialization completed successfully");
|
||||
|
||||
TestThread.handleExceptions();
|
||||
}
|
||||
|
||||
static final class TestBarrier extends CyclicBarrier
|
||||
implements Serializable {
|
||||
public TestBarrier(final int count) {
|
||||
super(count);
|
||||
}
|
||||
|
||||
private void writeObject(final ObjectOutputStream oos)
|
||||
throws IOException {
|
||||
oos.defaultWriteObject();
|
||||
// Wait until all test threads have started serializing data
|
||||
try {
|
||||
await();
|
||||
} catch (final Exception e) {
|
||||
throw new IOException("Test ERROR: Unexpected exception caught", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static final class TestThread extends Thread {
|
||||
private static final List<Exception> exceptions = new ArrayList<>();
|
||||
|
||||
private final Vector vector;
|
||||
private final CyclicBarrier testEnd;
|
||||
|
||||
public TestThread(final Vector vector, final CyclicBarrier testEnd) {
|
||||
this.vector = vector;
|
||||
this.testEnd = testEnd;
|
||||
setDaemon(true);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
|
||||
oos.writeObject(vector);
|
||||
oos.close();
|
||||
} catch (final IOException ioe) {
|
||||
addException(ioe);
|
||||
} finally {
|
||||
try {
|
||||
testEnd.await();
|
||||
} catch (Exception e) {
|
||||
addException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static synchronized void addException(final Exception exception) {
|
||||
exceptions.add(exception);
|
||||
}
|
||||
|
||||
public static synchronized void handleExceptions() {
|
||||
if (false == exceptions.isEmpty()) {
|
||||
throw new RuntimeException(getErrorText(exceptions));
|
||||
}
|
||||
}
|
||||
|
||||
private static String getErrorText(final List<Exception> exceptions) {
|
||||
final StringWriter sw = new StringWriter();
|
||||
final PrintWriter pw = new PrintWriter(sw);
|
||||
|
||||
pw.println("Test ERROR: Unexpected exceptions thrown on test threads:");
|
||||
for (Exception exception : exceptions) {
|
||||
pw.print("\t");
|
||||
pw.println(exception);
|
||||
for (StackTraceElement element : exception.getStackTrace()) {
|
||||
pw.print("\t\tat ");
|
||||
pw.println(element);
|
||||
}
|
||||
}
|
||||
|
||||
pw.close();
|
||||
return sw.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
87
test/jdk/java/util/Vector/SimpleSerialization.java
Normal file
87
test/jdk/java/util/Vector/SimpleSerialization.java
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* Copyright (c) 2010, 2011, 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 2010, 2011 IBM Corporation
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6934356
|
||||
* @summary A serialized Vector can be successfully de-serialized.
|
||||
* @author Neil Richards <neil.richards@ngmr.net>, <neil_richards@uk.ibm.com>
|
||||
*/
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.Vector;
|
||||
|
||||
public class SimpleSerialization {
|
||||
public static void main(final String[] args) throws Exception {
|
||||
final Vector<String> v1 = new Vector<>();
|
||||
|
||||
v1.add("entry1");
|
||||
v1.add("entry2");
|
||||
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
|
||||
oos.writeObject(v1);
|
||||
oos.close();
|
||||
|
||||
final byte[] data = baos.toByteArray();
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(data);
|
||||
final ObjectInputStream ois = new ObjectInputStream(bais);
|
||||
|
||||
final Object deserializedObject = ois.readObject();
|
||||
ois.close();
|
||||
|
||||
if (false == v1.equals(deserializedObject)) {
|
||||
throw new RuntimeException(getFailureText(v1, deserializedObject));
|
||||
}
|
||||
}
|
||||
|
||||
private static String getFailureText(final Object orig, final Object copy) {
|
||||
final StringWriter sw = new StringWriter();
|
||||
final PrintWriter pw = new PrintWriter(sw);
|
||||
|
||||
pw.println("Test FAILED: Deserialized object is not equal to the original object");
|
||||
pw.print("\tOriginal: ");
|
||||
printObject(pw, orig).println();
|
||||
pw.print("\tCopy: ");
|
||||
printObject(pw, copy).println();
|
||||
|
||||
pw.close();
|
||||
return sw.toString();
|
||||
}
|
||||
|
||||
private static PrintWriter printObject(final PrintWriter pw, final Object o) {
|
||||
pw.printf("%s@%08x", o.getClass().getName(), System.identityHashCode(o));
|
||||
return pw;
|
||||
}
|
||||
}
|
||||
61
test/jdk/java/util/Vector/SyncLastIndexOf.java
Normal file
61
test/jdk/java/util/Vector/SyncLastIndexOf.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2001, 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 4334376
|
||||
* @summary Vector's lastIndexOf(Object) was lacking synchronization
|
||||
* @author Konstantin Kladko
|
||||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
public class SyncLastIndexOf {
|
||||
|
||||
static Vector v = new Vector();
|
||||
|
||||
static class RemovingThread extends Thread {
|
||||
|
||||
public void run() {
|
||||
synchronized (v) {
|
||||
try {
|
||||
sleep(200);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
v.removeElementAt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Integer x = new Integer(1);
|
||||
v.addElement(x);
|
||||
new RemovingThread().start();
|
||||
try {
|
||||
v.lastIndexOf(x);
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
throw new RuntimeException(
|
||||
"Vector.lastIndexOf() synchronization failed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue