You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2023/01/12 19:48:22 UTC
[tomcat] branch main updated: Remove SecurityManager references from the o.a.t.utils package
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new 9c0682869d Remove SecurityManager references from the o.a.t.utils package
9c0682869d is described below
commit 9c0682869d9bbbd124d8ad9c96b95ab57328ba11
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Jan 12 19:48:15 2023 +0000
Remove SecurityManager references from the o.a.t.utils package
---
.../apache/tomcat/dbcp/dbcp2/BasicDataSource.java | 39 -------
java/org/apache/tomcat/dbcp/dbcp2/Utils.java | 12 --
.../apache/tomcat/dbcp/pool2/impl/CallStack.java | 1 -
.../tomcat/dbcp/pool2/impl/CallStackUtils.java | 85 --------------
.../dbcp/pool2/impl/DefaultPooledObject.java | 8 +-
.../tomcat/dbcp/pool2/impl/EvictionTimer.java | 8 +-
.../dbcp/pool2/impl/SecurityManagerCallStack.java | 122 ---------------------
.../org/apache/tomcat/util/compat/JrePlatform.java | 10 +-
.../apache/tomcat/util/descriptor/Constants.java | 5 +-
.../tomcat/util/descriptor/tld/TldParser.java | 26 +----
java/org/apache/tomcat/util/net/Constants.java | 2 -
.../tomcat/util/security/PrivilegedGetTccl.java | 28 -----
.../PrivilegedSetAccessControlContext.java | 67 -----------
.../tomcat/util/security/PrivilegedSetTccl.java | 41 -------
java/org/apache/tomcat/util/threads/Constants.java | 5 -
.../tomcat/util/threads/TaskThreadFactory.java | 26 +----
.../tomcat/util/threads/ThreadPoolExecutor.java | 44 --------
.../tomcat/websocket/AsyncChannelGroupUtil.java | 46 +-------
.../apache/tomcat/jdbc/pool/ConnectionPool.java | 15 +--
19 files changed, 20 insertions(+), 570 deletions(-)
diff --git a/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java b/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java
index a9cf96761c..b3729e025c 100644
--- a/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java
+++ b/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java
@@ -19,9 +19,6 @@ package org.apache.tomcat.dbcp.dbcp2;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
@@ -73,30 +70,6 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
static {
// Attempt to prevent deadlocks - see DBCP - 272
DriverManager.getDrivers();
- try {
- // Load classes now to prevent AccessControlExceptions later
- // A number of classes are loaded when getConnection() is called
- // but the following classes are not loaded and therefore require
- // explicit loading.
- if (Utils.isSecurityEnabled()) {
- final ClassLoader loader = BasicDataSource.class.getClassLoader();
- final String dbcpPackageName = BasicDataSource.class.getPackage().getName();
- loader.loadClass(dbcpPackageName + ".DelegatingCallableStatement");
- loader.loadClass(dbcpPackageName + ".DelegatingDatabaseMetaData");
- loader.loadClass(dbcpPackageName + ".DelegatingPreparedStatement");
- loader.loadClass(dbcpPackageName + ".DelegatingResultSet");
- loader.loadClass(dbcpPackageName + ".PoolableCallableStatement");
- loader.loadClass(dbcpPackageName + ".PoolablePreparedStatement");
- loader.loadClass(dbcpPackageName + ".PoolingConnection$StatementType");
- loader.loadClass(dbcpPackageName + ".PStmtKey");
-
- final String poolPackageName = PooledObject.class.getPackage().getName();
- loader.loadClass(poolPackageName + ".impl.LinkedBlockingDeque$Node");
- loader.loadClass(poolPackageName + ".impl.GenericKeyedObjectPool$ObjectDeque");
- }
- } catch (final ClassNotFoundException cnfe) {
- throw new IllegalStateException("Unable to pre-load classes", cnfe);
- }
}
/**
@@ -695,18 +668,6 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
*/
@Override
public Connection getConnection() throws SQLException {
- if (Utils.isSecurityEnabled()) {
- final PrivilegedExceptionAction<Connection> action = () -> createDataSource().getConnection();
- try {
- return AccessController.doPrivileged(action);
- } catch (final PrivilegedActionException e) {
- final Throwable cause = e.getCause();
- if (cause instanceof SQLException) {
- throw (SQLException) cause;
- }
- throw new SQLException(e);
- }
- }
return createDataSource().getConnection();
}
diff --git a/java/org/apache/tomcat/dbcp/dbcp2/Utils.java b/java/org/apache/tomcat/dbcp/dbcp2/Utils.java
index 7b44dcdcb0..70f9542f5e 100644
--- a/java/org/apache/tomcat/dbcp/dbcp2/Utils.java
+++ b/java/org/apache/tomcat/dbcp/dbcp2/Utils.java
@@ -42,14 +42,6 @@ public final class Utils {
private static final ResourceBundle messages = ResourceBundle
.getBundle(Utils.class.getPackage().getName() + ".LocalStrings");
- /**
- * Whether the security manager is enabled.
- *
- * @deprecated No replacement.
- */
- @Deprecated
- public static final boolean IS_SECURITY_ENABLED = isSecurityEnabled();
-
/** Any SQL_STATE starting with this value is considered a fatal disconnect */
public static final String DISCONNECTION_SQL_CODE_PREFIX = "08";
@@ -217,10 +209,6 @@ public final class Utils {
return collection == null || collection.isEmpty();
}
- static boolean isSecurityEnabled() {
- return System.getSecurityManager() != null;
- }
-
/**
* Converts the given String to a char[].
*
diff --git a/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java b/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java
index 0f34709cfa..399dc04ac2 100644
--- a/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java
+++ b/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java
@@ -26,7 +26,6 @@ import org.apache.tomcat.dbcp.pool2.UsageTracking;
* {@linkplain UsageTracking usage tracking} so that different JVMs and configurations can use more efficient strategies
* for obtaining the current call stack depending on metadata needs.
*
- * @see CallStackUtils
* @since 2.4.3
*/
public interface CallStack {
diff --git a/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java b/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java
deleted file mode 100644
index 831343fd2b..0000000000
--- a/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomcat.dbcp.pool2.impl;
-
-import java.security.AccessControlException;
-
-/**
- * Utility methods for {@link CallStack}.
- *
- * @since 2.4.3
- */
-public final class CallStackUtils {
-
- /**
- * Tests whether the caller can create a security manager in the current environment.
- *
- * @return {@code true} if it is able to create a security manager in the current environment, {@code false}
- * otherwise.
- */
- private static boolean canCreateSecurityManager() {
- final SecurityManager manager = System.getSecurityManager();
- if (manager == null) {
- return true;
- }
- try {
- manager.checkPermission(new RuntimePermission("createSecurityManager"));
- return true;
- } catch (final AccessControlException ignored) {
- return false;
- }
- }
-
- /**
- * Constructs a new {@link CallStack} using the fastest allowed strategy.
- *
- * @param messageFormat message (or format) to print first in stack traces
- * @param useTimestamp if true, interpret message as a SimpleDateFormat and print the created timestamp; otherwise,
- * print message format literally
- * @return a new CallStack
- * @deprecated use {@link #newCallStack(String, boolean, boolean)}
- */
- @Deprecated
- public static CallStack newCallStack(final String messageFormat, final boolean useTimestamp) {
- return newCallStack(messageFormat, useTimestamp, false);
- }
-
- /**
- * Constructs a new {@link CallStack} using the fasted allowed strategy.
- *
- * @param messageFormat message (or format) to print first in stack traces
- * @param useTimestamp if true, interpret message as a SimpleDateFormat and print the created timestamp;
- * otherwise, print message format literally
- * @param requireFullStackTrace if true, forces the use of a stack walking mechanism that includes full stack trace
- * information; otherwise, uses a faster implementation if possible
- * @return a new CallStack
- * @since 2.5
- */
- public static CallStack newCallStack(final String messageFormat,
- final boolean useTimestamp,
- final boolean requireFullStackTrace) {
- return canCreateSecurityManager() && !requireFullStackTrace ?
- new SecurityManagerCallStack(messageFormat, useTimestamp) :
- new ThrowableCallStack(messageFormat, useTimestamp);
- }
-
- /**
- * Hidden constructor.
- */
- private CallStackUtils() {
- }
-}
diff --git a/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java b/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java
index 3894d871e7..69954c8360 100644
--- a/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java
+++ b/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java
@@ -306,11 +306,9 @@ public class DefaultPooledObject<T> implements PooledObject<T> {
*/
@Override
public void setRequireFullStackTrace(final boolean requireFullStackTrace) {
- borrowedBy = CallStackUtils.newCallStack("'Pooled object created' " +
- "yyyy-MM-dd HH:mm:ss Z 'by the following code has not been returned to the pool:'",
- true, requireFullStackTrace);
- usedBy = CallStackUtils.newCallStack("The last code to use this object was:",
- false, requireFullStackTrace);
+ borrowedBy = new ThrowableCallStack("'Pooled object created' " +
+ "yyyy-MM-dd HH:mm:ss Z 'by the following code has not been returned to the pool:'", true);
+ usedBy = new ThrowableCallStack("The last code to use this object was:", false);
}
@Override
diff --git a/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java b/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java
index 8e86e1a218..5b930c9d3f 100644
--- a/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java
+++ b/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java
@@ -17,8 +17,6 @@
package org.apache.tomcat.dbcp.pool2.impl;
import java.lang.ref.WeakReference;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map.Entry;
@@ -57,11 +55,7 @@ class EvictionTimer {
public Thread newThread(final Runnable runnable) {
final Thread thread = new Thread(null, runnable, "commons-pool-evictor");
thread.setDaemon(true); // POOL-363 - Required for applications using Runtime.addShutdownHook().
- AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
- thread.setContextClassLoader(EvictorThreadFactory.class.getClassLoader());
- return null;
- });
-
+ thread.setContextClassLoader(EvictorThreadFactory.class.getClassLoader());
return thread;
}
}
diff --git a/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java b/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java
deleted file mode 100644
index 04e030ae94..0000000000
--- a/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomcat.dbcp.pool2.impl;
-
-import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * A {@link CallStack} strategy using a {@link SecurityManager}. Obtaining the current call stack is much faster via a
- * SecurityManger, but access to the underlying method may be restricted by the current SecurityManager. In environments
- * where a SecurityManager cannot be created, {@link ThrowableCallStack} should be used instead.
- *
- * @see RuntimePermission
- * @see SecurityManager#getClassContext()
- * @since 2.4.3
- */
-public class SecurityManagerCallStack implements CallStack {
-
- /**
- * A custom security manager.
- */
- private static class PrivateSecurityManager extends SecurityManager {
-
- /**
- * Gets the class stack.
- *
- * @return class stack
- */
- private List<WeakReference<Class<?>>> getCallStack() {
- final Stream<WeakReference<Class<?>>> map = Stream.of(getClassContext()).map(WeakReference::new);
- return map.collect(Collectors.toList());
- }
- }
-
- /**
- * A snapshot of a class stack.
- */
- private static class Snapshot {
- private final long timestampMillis = System.currentTimeMillis();
- private final List<WeakReference<Class<?>>> stack;
-
- /**
- * Constructs a new snapshot with a class stack.
- *
- * @param stack class stack
- */
- private Snapshot(final List<WeakReference<Class<?>>> stack) {
- this.stack = stack;
- }
- }
-
- private final String messageFormat;
-
- //@GuardedBy("dateFormat")
- private final DateFormat dateFormat;
-
- private final PrivateSecurityManager securityManager;
-
- private volatile Snapshot snapshot;
-
- /**
- * Creates a new instance.
- *
- * @param messageFormat message format
- * @param useTimestamp whether to format the dates in the output message or not
- */
- public SecurityManagerCallStack(final String messageFormat, final boolean useTimestamp) {
- this.messageFormat = messageFormat;
- this.dateFormat = useTimestamp ? new SimpleDateFormat(messageFormat) : null;
- this.securityManager = AccessController.doPrivileged((PrivilegedAction<PrivateSecurityManager>) PrivateSecurityManager::new);
- }
-
- @Override
- public void clear() {
- snapshot = null;
- }
-
- @Override
- public void fillInStackTrace() {
- snapshot = new Snapshot(securityManager.getCallStack());
- }
-
- @Override
- public boolean printStackTrace(final PrintWriter writer) {
- final Snapshot snapshotRef = this.snapshot;
- if (snapshotRef == null) {
- return false;
- }
- final String message;
- if (dateFormat == null) {
- message = messageFormat;
- } else {
- synchronized (dateFormat) {
- message = dateFormat.format(Long.valueOf(snapshotRef.timestampMillis));
- }
- }
- writer.println(message);
- snapshotRef.stack.forEach(reference -> writer.println(reference.get()));
- return true;
- }
-}
diff --git a/java/org/apache/tomcat/util/compat/JrePlatform.java b/java/org/apache/tomcat/util/compat/JrePlatform.java
index 66717d664f..b0db4f3797 100644
--- a/java/org/apache/tomcat/util/compat/JrePlatform.java
+++ b/java/org/apache/tomcat/util/compat/JrePlatform.java
@@ -16,8 +16,6 @@
*/
package org.apache.tomcat.util.compat;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.Locale;
public class JrePlatform {
@@ -37,13 +35,7 @@ public class JrePlatform {
*/
// This check is derived from the check in Apache Commons Lang
- String osName;
- if (System.getSecurityManager() == null) {
- osName = System.getProperty(OS_NAME_PROPERTY);
- } else {
- osName = AccessController.doPrivileged(
- (PrivilegedAction<String>) () -> System.getProperty(OS_NAME_PROPERTY));
- }
+ String osName = System.getProperty(OS_NAME_PROPERTY);
IS_MAC_OS = osName.toLowerCase(Locale.ENGLISH).startsWith("mac os x");
diff --git a/java/org/apache/tomcat/util/descriptor/Constants.java b/java/org/apache/tomcat/util/descriptor/Constants.java
index 2ad599666a..08f18bfaf0 100644
--- a/java/org/apache/tomcat/util/descriptor/Constants.java
+++ b/java/org/apache/tomcat/util/descriptor/Constants.java
@@ -18,8 +18,5 @@ package org.apache.tomcat.util.descriptor;
public class Constants {
- public static final String PACKAGE_NAME =
- Constants.class.getPackage().getName();
-
- public static final boolean IS_SECURITY_ENABLED = (System.getSecurityManager() != null);
+ public static final String PACKAGE_NAME = Constants.class.getPackage().getName();
}
diff --git a/java/org/apache/tomcat/util/descriptor/tld/TldParser.java b/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
index e31c2fea58..df2e9c977a 100644
--- a/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
+++ b/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
@@ -18,17 +18,13 @@ package org.apache.tomcat.util.descriptor.tld;
import java.io.IOException;
import java.io.InputStream;
-import java.security.AccessController;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.util.descriptor.Constants;
import org.apache.tomcat.util.descriptor.DigesterFactory;
import org.apache.tomcat.util.descriptor.XmlErrorHandler;
import org.apache.tomcat.util.digester.Digester;
import org.apache.tomcat.util.digester.RuleSet;
-import org.apache.tomcat.util.security.PrivilegedGetTccl;
-import org.apache.tomcat.util.security.PrivilegedSetTccl;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -51,20 +47,9 @@ public class TldParser {
}
public TaglibXml parse(TldResourcePath path) throws IOException, SAXException {
- ClassLoader original;
- if (Constants.IS_SECURITY_ENABLED) {
- PrivilegedGetTccl pa = new PrivilegedGetTccl();
- original = AccessController.doPrivileged(pa);
- } else {
- original = Thread.currentThread().getContextClassLoader();
- }
+ ClassLoader original = Thread.currentThread().getContextClassLoader();
try (InputStream is = path.openStream()) {
- if (Constants.IS_SECURITY_ENABLED) {
- PrivilegedSetTccl pa = new PrivilegedSetTccl(TldParser.class.getClassLoader());
- AccessController.doPrivileged(pa);
- } else {
- Thread.currentThread().setContextClassLoader(TldParser.class.getClassLoader());
- }
+ Thread.currentThread().setContextClassLoader(TldParser.class.getClassLoader());
XmlErrorHandler handler = new XmlErrorHandler();
digester.setErrorHandler(handler);
@@ -84,12 +69,7 @@ public class TldParser {
return taglibXml;
} finally {
digester.reset();
- if (Constants.IS_SECURITY_ENABLED) {
- PrivilegedSetTccl pa = new PrivilegedSetTccl(original);
- AccessController.doPrivileged(pa);
- } else {
- Thread.currentThread().setContextClassLoader(original);
- }
+ Thread.currentThread().setContextClassLoader(original);
}
}
diff --git a/java/org/apache/tomcat/util/net/Constants.java b/java/org/apache/tomcat/util/net/Constants.java
index 9cda5e1836..ca5c0e4a15 100644
--- a/java/org/apache/tomcat/util/net/Constants.java
+++ b/java/org/apache/tomcat/util/net/Constants.java
@@ -38,6 +38,4 @@ public class Constants {
public static final String SSL_PROTO_SSLv3 = "SSLv3";
public static final String SSL_PROTO_SSLv2 = "SSLv2";
public static final String SSL_PROTO_SSLv2Hello = "SSLv2Hello";
-
- public static final boolean IS_SECURITY_ENABLED = (System.getSecurityManager() != null);
}
diff --git a/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java b/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java
deleted file mode 100644
index 11d11a8602..0000000000
--- a/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomcat.util.security;
-
-import java.security.PrivilegedAction;
-
-public class PrivilegedGetTccl implements PrivilegedAction<ClassLoader> {
- @Override
- public ClassLoader run() {
- return Thread.currentThread().getContextClassLoader();
- }
-}
-
-
diff --git a/java/org/apache/tomcat/util/security/PrivilegedSetAccessControlContext.java b/java/org/apache/tomcat/util/security/PrivilegedSetAccessControlContext.java
deleted file mode 100644
index 2f53480087..0000000000
--- a/java/org/apache/tomcat/util/security/PrivilegedSetAccessControlContext.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomcat.util.security;
-
-import java.lang.reflect.Field;
-import java.security.AccessControlContext;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.util.res.StringManager;
-
-public class PrivilegedSetAccessControlContext implements PrivilegedAction<Void> {
-
- private static final Log log = LogFactory.getLog(PrivilegedSetAccessControlContext.class);
- private static final StringManager sm = StringManager.getManager(PrivilegedSetAccessControlContext.class);
-
- private static final AccessControlContext acc;
- private static final Field field;
-
- static {
- acc = AccessController.getContext();
- Field f = null;
- try {
- f = Thread.class.getDeclaredField("inheritedAccessControlContext");
- f.trySetAccessible();
- } catch (NoSuchFieldException | SecurityException e) {
- log.warn(sm.getString("privilegedSetAccessControlContext.lookupFailed"), e);
- }
- field = f;
- }
-
- private final Thread t;
-
-
- public PrivilegedSetAccessControlContext(Thread t) {
- this.t = t;
- }
-
-
- @Override
- public Void run() {
- try {
- if (field != null) {
- field.set(t, acc);
- }
- } catch (IllegalArgumentException | IllegalAccessException e) {
- log.warn(sm.getString("privilegedSetAccessControlContext.setFailed"), e);
- }
- return null;
- }
-}
\ No newline at end of file
diff --git a/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java b/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java
deleted file mode 100644
index 739d915794..0000000000
--- a/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomcat.util.security;
-
-import java.security.PrivilegedAction;
-
-public class PrivilegedSetTccl implements PrivilegedAction<Void> {
-
- private final ClassLoader cl;
- private final Thread t;
-
- public PrivilegedSetTccl(ClassLoader cl) {
- this(Thread.currentThread(), cl);
- }
-
- public PrivilegedSetTccl(Thread t, ClassLoader cl) {
- this.t = t;
- this.cl = cl;
- }
-
-
- @Override
- public Void run() {
- t.setContextClassLoader(cl);
- return null;
- }
-}
\ No newline at end of file
diff --git a/java/org/apache/tomcat/util/threads/Constants.java b/java/org/apache/tomcat/util/threads/Constants.java
index 5dcaccef21..715845d9d4 100644
--- a/java/org/apache/tomcat/util/threads/Constants.java
+++ b/java/org/apache/tomcat/util/threads/Constants.java
@@ -22,9 +22,4 @@ package org.apache.tomcat.util.threads;
public final class Constants {
public static final long DEFAULT_THREAD_RENEWAL_DELAY = 1000L;
-
- /**
- * Has security been turned on?
- */
- public static final boolean IS_SECURITY_ENABLED = (System.getSecurityManager() != null);
}
diff --git a/java/org/apache/tomcat/util/threads/TaskThreadFactory.java b/java/org/apache/tomcat/util/threads/TaskThreadFactory.java
index 4320f9b6cb..71ae99d9c0 100644
--- a/java/org/apache/tomcat/util/threads/TaskThreadFactory.java
+++ b/java/org/apache/tomcat/util/threads/TaskThreadFactory.java
@@ -16,14 +16,9 @@
*/
package org.apache.tomcat.util.threads;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.tomcat.util.security.PrivilegedSetAccessControlContext;
-import org.apache.tomcat.util.security.PrivilegedSetTccl;
-
/**
* Simple task thread factory to use to create threads for an executor
* implementation.
@@ -37,8 +32,7 @@ public class TaskThreadFactory implements ThreadFactory {
private final int threadPriority;
public TaskThreadFactory(String namePrefix, boolean daemon, int priority) {
- SecurityManager s = System.getSecurityManager();
- group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
+ group = Thread.currentThread().getThreadGroup();
this.namePrefix = namePrefix;
this.daemon = daemon;
this.threadPriority = priority;
@@ -49,23 +43,7 @@ public class TaskThreadFactory implements ThreadFactory {
TaskThread t = new TaskThread(group, r, namePrefix + threadNumber.getAndIncrement());
t.setDaemon(daemon);
t.setPriority(threadPriority);
-
- if (Constants.IS_SECURITY_ENABLED) {
- // Set the context class loader of newly created threads to be the
- // class loader that loaded this factory. This avoids retaining
- // references to web application class loaders and similar.
- PrivilegedAction<Void> pa = new PrivilegedSetTccl(
- t, getClass().getClassLoader());
- AccessController.doPrivileged(pa);
-
- // This method may be triggered from an InnocuousThread. Ensure that
- // the thread inherits an appropriate AccessControlContext
- pa = new PrivilegedSetAccessControlContext(t);
- AccessController.doPrivileged(pa);
- } else {
- t.setContextClassLoader(getClass().getClassLoader());
- }
-
+ t.setContextClassLoader(getClass().getClassLoader());
return t;
}
}
diff --git a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
index 1844dcba28..1f4c8d5c8f 100644
--- a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
+++ b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
@@ -584,29 +584,6 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
*/
private static final RejectedExecutionHandler defaultHandler = new RejectPolicy();
- /**
- * Permission required for callers of shutdown and shutdownNow.
- * We additionally require (see checkShutdownAccess) that callers
- * have permission to actually interrupt threads in the worker set
- * (as governed by Thread.interrupt, which relies on
- * ThreadGroup.checkAccess, which in turn relies on
- * SecurityManager.checkAccess). Shutdowns are attempted only if
- * these checks pass.
- *
- * All actual invocations of Thread.interrupt (see
- * interruptIdleWorkers and interruptWorkers) ignore
- * SecurityExceptions, meaning that the attempted interrupts
- * silently fail. In the case of shutdown, they should not fail
- * unless the SecurityManager has inconsistent policies, sometimes
- * allowing access to a thread and sometimes not. In such cases,
- * failure to actually interrupt threads may disable or delay full
- * termination. Other uses of interruptIdleWorkers are advisory,
- * and failure to actually interrupt will merely delay response to
- * configuration changes so is not handled exceptionally.
- */
- private static final RuntimePermission shutdownPerm =
- new RuntimePermission("modifyThread");
-
/**
* Class Worker mainly maintains interrupt control state for
* threads running tasks, along with other minor bookkeeping.
@@ -769,25 +746,6 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
* Methods for controlling interrupts to worker threads.
*/
- /**
- * If there is a security manager, makes sure caller has
- * permission to shut down threads in general (see shutdownPerm).
- * If this passes, additionally makes sure the caller is allowed
- * to interrupt each worker thread. This might not be true even if
- * first check passed, if the SecurityManager treats some threads
- * specially.
- */
- private void checkShutdownAccess() {
- // assert mainLock.isHeldByCurrentThread();
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(shutdownPerm);
- for (Worker w : workers) {
- security.checkAccess(w.thread);
- }
- }
- }
-
/**
* Interrupts all threads, even if active. Ignores SecurityExceptions
* (in which case some threads may remain uninterrupted).
@@ -1469,7 +1427,6 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
- checkShutdownAccess();
advanceRunState(SHUTDOWN);
interruptIdleWorkers();
onShutdown(); // hook for ScheduledThreadPoolExecutor
@@ -1502,7 +1459,6 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
- checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks = drainQueue();
diff --git a/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java b/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
index 6d1413bdaa..c0e839fb3d 100644
--- a/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
+++ b/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
@@ -18,8 +18,6 @@ package org.apache.tomcat.websocket;
import java.io.IOException;
import java.nio.channels.AsynchronousChannelGroup;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
@@ -105,47 +103,15 @@ public class AsyncChannelGroupUtil {
private static class AsyncIOThreadFactory implements ThreadFactory {
- static {
- // Load NewThreadPrivilegedAction since newThread() will not be able
- // to if called from an InnocuousThread.
- // See https://bz.apache.org/bugzilla/show_bug.cgi?id=57490
- NewThreadPrivilegedAction.load();
- }
-
+ private static AtomicInteger count = new AtomicInteger(0);
@Override
public Thread newThread(final Runnable r) {
- // Create the new Thread within a doPrivileged block to ensure that
- // the thread inherits the current ProtectionDomain which is
- // essential to be able to use this with a Java Applet. See
- // https://bz.apache.org/bugzilla/show_bug.cgi?id=57091
- return AccessController.doPrivileged(new NewThreadPrivilegedAction(r));
- }
-
- // Non-anonymous class so that AsyncIOThreadFactory can load it
- // explicitly
- private static class NewThreadPrivilegedAction implements PrivilegedAction<Thread> {
-
- private static AtomicInteger count = new AtomicInteger(0);
-
- private final Runnable r;
-
- public NewThreadPrivilegedAction(Runnable r) {
- this.r = r;
- }
-
- @Override
- public Thread run() {
- Thread t = new Thread(r);
- t.setName("WebSocketClient-AsyncIO-" + count.incrementAndGet());
- t.setContextClassLoader(this.getClass().getClassLoader());
- t.setDaemon(true);
- return t;
- }
-
- private static void load() {
- // NO-OP. Just provides a hook to enable the class to be loaded
- }
+ Thread t = new Thread(r);
+ t.setName("WebSocketClient-AsyncIO-" + count.incrementAndGet());
+ t.setContextClassLoader(this.getClass().getClassLoader());
+ t.setDaemon(true);
+ return t;
}
}
}
diff --git a/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java b/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
index 58505cabc6..b20bb55084 100644
--- a/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
+++ b/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
@@ -20,8 +20,6 @@ import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collections;
@@ -1526,8 +1524,9 @@ public class ConnectionPool {
// Create the timer thread in a PrivilegedAction so that a
// reference to the web application class loader is not created
// via Thread.inheritedAccessControlContext
- PrivilegedAction<Timer> pa = new PrivilegedNewTimer();
- poolCleanTimer = AccessController.doPrivileged(pa);
+ poolCleanTimer = new Timer("Tomcat JDBC Pool Cleaner[" +
+ System.identityHashCode(ConnectionPool.class.getClassLoader()) + ":"+
+ System.currentTimeMillis() + "]", true);
} finally {
Thread.currentThread().setContextClassLoader(loader);
}
@@ -1549,14 +1548,6 @@ public class ConnectionPool {
}
}
- private static class PrivilegedNewTimer implements PrivilegedAction<Timer> {
- @Override
- public Timer run() {
- return new Timer("Tomcat JDBC Pool Cleaner["+ System.identityHashCode(ConnectionPool.class.getClassLoader()) + ":"+
- System.currentTimeMillis() + "]", true);
- }
- }
-
public static Set<TimerTask> getPoolCleaners() {
return Collections.<TimerTask>unmodifiableSet(cleaners);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org