From cecb6289706b78add6740af644d0d878d611962f Mon Sep 17 00:00:00 2001 From: Sean Coffey Date: Fri, 24 Feb 2012 09:17:46 +0000 Subject: [PATCH] 7144488: Infinite recursion for some equals tests in Collections Reviewed-by: alanb, dholmes, mduigou --- .../share/classes/java/util/Collections.java | 10 ++- .../java/util/Collections/EqualsTest.java | 67 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 jdk/test/java/util/Collections/EqualsTest.java diff --git a/jdk/src/share/classes/java/util/Collections.java b/jdk/src/share/classes/java/util/Collections.java index 04e642e1c00..d18d5682336 100644 --- a/jdk/src/share/classes/java/util/Collections.java +++ b/jdk/src/share/classes/java/util/Collections.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, 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 @@ -1489,6 +1489,8 @@ public class Collections { } public int hashCode() {return e.hashCode();} public boolean equals(Object o) { + if (this == o) + return true; if (!(o instanceof Map.Entry)) return false; Map.Entry t = (Map.Entry)o; @@ -1709,6 +1711,8 @@ public class Collections { } public boolean equals(Object o) { + if (this == o) + return true; synchronized (mutex) {return c.equals(o);} } public int hashCode() { @@ -1863,6 +1867,8 @@ public class Collections { } public boolean equals(Object o) { + if (this == o) + return true; synchronized (mutex) {return list.equals(o);} } public int hashCode() { @@ -2073,6 +2079,8 @@ public class Collections { } public boolean equals(Object o) { + if (this == o) + return true; synchronized (mutex) {return m.equals(o);} } public int hashCode() { diff --git a/jdk/test/java/util/Collections/EqualsTest.java b/jdk/test/java/util/Collections/EqualsTest.java new file mode 100644 index 00000000000..2c76751b820 --- /dev/null +++ b/jdk/test/java/util/Collections/EqualsTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2012, 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 7144488 + * @summary Infinite recursion for some equals tests in Collections + */ + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class EqualsTest { + public static void main(String[] args) { + boolean test; + + /* synchronizedList test */ + List list = Collections.synchronizedList(new ArrayList()); + list.add(list); + test = list.equals(list); + assertTrue(test); + list.remove(list); + + /* synchronizedSet test */ + Set s = Collections.synchronizedSet(new HashSet()); + s.add(s); + test = s.equals(s); + assertTrue(test); + + /* synchronizedMap test */ + Map m = Collections.synchronizedMap(new HashMap()); + test = m.equals(m); + assertTrue(test); + + } + + private static void assertTrue(boolean b) { + if (!b) + throw new RuntimeException("assertion failed"); + } +} +