1 /* 2 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 4671598 27 * @summary PermissionCollection is not properly synchronized 28 */ 29 30 import java.security.*; // AllPermission, BasicPermission, Permissions 31 import java.net.NetPermission; 32 import java.net.SocketPermission; 33 import java.io.FilePermission; 34 import java.util.PropertyPermission; 35 import javax.security.auth.AuthPermission; 36 import javax.security.auth.kerberos.DelegationPermission; 37 import javax.security.auth.kerberos.ServicePermission; 38 import javax.management.MBeanServerPermission; 39 import com.sun.rmi.rmid.ExecPermission; 40 import com.sun.rmi.rmid.ExecOptionPermission; 41 42 import java.util.*; 43 44 public class Concurrent { 45 private static final int LIMIT1 = 2000; 46 private static final int LIMIT2 = 1000; 47 private static final boolean debug = false; 48 private static final Map errors = 49 Collections.synchronizedMap(new HashMap()); 50 51 public static void main(String args[]) throws Exception { 52 testPc(allp); 53 testPc(filep); 54 testPc(sockp); 55 testPc(propp); 56 testPc(basicp); 57 testPc(delegatep); 58 testPc(servicep); 59 testPc(mbeanp); 60 testPc(unresp); 61 62 testPerms(); 63 64 if (errors.size() > 0) { 65 if (true) { 66 Iterator iter = errors.entrySet().iterator(); 67 while (iter.hasNext()) { 68 System.out.println(iter.next()); 69 } 70 }; 71 throw (Exception) new Exception("Got errors"); 72 } 73 } 74 75 private static void testPc (final Permission[] perm) throws Exception { 76 77 final PermissionCollection pc = perm[0].newPermissionCollection(); 78 79 new Thread() { 80 { 81 setDaemon(true); 82 start(); 83 } 84 public void run() { 85 try { 86 for (int i = 0; i < LIMIT1; i++) { 87 for (int j = 0; j < perm.length; j++) { 88 pc.add(perm[j]); 89 if (debug) { 90 System.out.println("added " + perm[j]); 91 } 92 } 93 } 94 } catch (Exception e) { 95 errors.put(perm[0].getClass().getName(), e); 96 } 97 } 98 }; 99 try { 100 for (int i = 0; i < LIMIT2; i++) { 101 boolean result = pc.implies(perm[perm.length-1]); 102 if (debug) { 103 System.out.println(perm[perm.length-1] + " implies " + result); 104 } 105 106 synchronized (pc) { 107 Enumeration en = pc.elements(); 108 while (en.hasMoreElements()) { 109 Object obj = en.nextElement(); 110 if (debug) { 111 System.out.println(obj); 112 } 113 } 114 } 115 } 116 } catch (Exception e) { 117 errors.put(perm[0].getClass().getName(), e); 118 } 119 } 120 121 private static void testPerms () throws Exception { 122 123 final Permissions pc = new Permissions(); 124 125 new Thread() { 126 { 127 setDaemon(true); 128 start(); 129 } 130 public void run() { 131 try { 132 for (int i = 0; i < LIMIT1; i++) { 133 for (int j = 0; j < permlist.length; j++) { 134 for (int k = 0; k < permlist[j].length; k++) { 135 pc.add(permlist[j][k]); 136 } 137 } 138 } 139 } catch (Exception e) { 140 errors.put("java.security.Permissions", e); 141 } 142 } 143 }; 144 try { 145 for (int i = 0; i < LIMIT2; i++) { 146 for (int j = 0; j < permlist.length; j++) { 147 boolean result = pc.implies(permlist[j][0]); 148 if (debug) { 149 System.out.println(permlist[j][0] + " implies " + result); 150 } 151 } 152 153 synchronized (pc) { 154 Enumeration en = pc.elements(); 155 while (en.hasMoreElements()) { 156 Object obj = en.nextElement(); 157 if (debug) { 158 System.out.println(obj); 159 } 160 } 161 } 162 } 163 } catch (Exception e) { 164 errors.put("java.security.Permissions", e); 165 } 166 } 167 168 private static final Permission[] allp = new Permission[]{ 169 new AllPermission(), new AllPermission()}; 170 171 private static final Permission[] filep = new Permission[]{ 172 new FilePermission("/home/foobar", "read"), 173 new FilePermission("/home/foo", "write"), 174 new FilePermission("/home/foobar", "read,write"), 175 }; 176 177 private static final Permission[] sockp = new Permission[]{ 178 new SocketPermission("example.net", "connect"), 179 new SocketPermission("www.sun.com", "resolve"), 180 new SocketPermission("www.test1.com", "accept"), 181 new SocketPermission("www.test3.com", "resolve,connect"), 182 new SocketPermission("www.test4.com", "listen"), 183 }; 184 185 private static final Permission[] propp = new Permission[]{ 186 new PropertyPermission("user.home", "read"), 187 new PropertyPermission("java.home", "write"), 188 new PropertyPermission("test.home", "write"), 189 new PropertyPermission("test1.home", "read"), 190 new PropertyPermission("test2.home", "read"), 191 }; 192 193 private static final Permission[] basicp = new Permission[] { 194 new NetPermission("setDefaultAuthenticator"), 195 new NetPermission("requestPasswordAuthentication"), 196 new NetPermission("specifyStreamHandler") 197 }; 198 199 private static final Permission[] delegatep = new Permission[] { 200 new DelegationPermission( 201 "\"host/foo.example.com@EXAMPLE.COM\" \"cn=John,o=imc,c=us\""), 202 new DelegationPermission( 203 "\"user/rosanna@EXAMPLE.COM\" \"cn=John,o=imc,c=us\""), 204 new DelegationPermission( 205 "\"host/bar.example.com@EXAMPLE.COM\" \"cn=John,o=imc,c=us\"") 206 }; 207 208 private static final Permission[] servicep = new Permission[]{ 209 new ServicePermission("krbtgt/EXAMPLE.COM@EXAMPLE.COM", "initiate"), 210 new ServicePermission("ldap/EXAMPLE.COM@EXAMPLE.COM", "initiate"), 211 new ServicePermission("imap/EXAMPLE.COM@EXAMPLE.COM", "accept"), 212 new ServicePermission("acap/EXAMPLE.COM@EXAMPLE.COM", "initiate"), 213 new ServicePermission("host/EXAMPLE.COM@EXAMPLE.COM", "initiate"), 214 }; 215 216 private static final Permission[] mbeanp = new Permission[] { 217 new MBeanServerPermission("createMBeanServer"), 218 new MBeanServerPermission("findMBeanServer"), 219 new MBeanServerPermission("newMBeanServer"), 220 new MBeanServerPermission("releaseMBeanServer"), 221 }; 222 223 private static final Permission[] unresp = new Permission[] { 224 new UnresolvedPermission("com.unknown.TestClass", "UnknownPermission", 225 "read,write", null), 226 new UnresolvedPermission("com.unknown.TestClass", "APermission", 227 "read,write", null), 228 new UnresolvedPermission("com.unknown.TestClass", "BPermission", 229 "read,write", null), 230 new UnresolvedPermission("com.unknown.CClass", "CPermission", 231 "read,write", null), 232 new UnresolvedPermission("com.unknown.DClass", "DUnknownPermission", 233 "read,write", null), 234 new UnresolvedPermission("com.unknown.EClass", "EUnknownPermission", 235 "read,write", null), 236 }; 237 238 private static final Permission[][] permlist = new Permission[][]{ 239 allp, filep, sockp, propp, basicp, delegatep, servicep, mbeanp, unresp}; 240 }