blob: 7b582998c33eaac3f36aa99e24c02b4f2703db4c [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 * @test
26 * @bug 4671598
27 * @summary PermissionCollection is not properly synchronized
28 */
29
30import java.security.*; // AllPermission, BasicPermission, Permissions
31import java.net.NetPermission;
32import java.net.SocketPermission;
33import java.io.FilePermission;
34import java.util.PropertyPermission;
35import javax.security.auth.AuthPermission;
36import javax.security.auth.kerberos.DelegationPermission;
37import javax.security.auth.kerberos.ServicePermission;
38import javax.management.MBeanServerPermission;
39import com.sun.rmi.rmid.ExecPermission;
40import com.sun.rmi.rmid.ExecOptionPermission;
41
42import java.util.*;
43
44public 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}