From 63d095169aedb0c5dcf86f331f5ec5348a677923 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Thu, 5 Dec 2024 01:24:29 +0000 Subject: [PATCH] 8345153: Clean up SecurityManager references from jdk.compiler module Reviewed-by: alanb, jlahoda, darcy --- .../tools/javac/file/JavacFileManager.java | 8 +- .../com/sun/tools/javac/jvm/ClassWriter.java | 10 +- .../tools/javac/launcher/SourceLauncher.java | 15 -- .../JavacProcessingEnvironment.java | 166 ++++-------------- .../tools/javac/processing/ServiceProxy.java | 152 ---------------- .../tools/javac/resources/compiler.properties | 3 - .../tools/javac/resources/launcher.properties | 3 - .../tools/javac/diags/examples.not-yet.txt | 1 - 8 files changed, 42 insertions(+), 316 deletions(-) delete mode 100644 src/jdk.compiler/share/classes/com/sun/tools/javac/processing/ServiceProxy.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java index e7ce967065b..5cc6c69096c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, 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 @@ -54,14 +54,12 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Objects; import java.util.ServiceLoader; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.ZipException; @@ -327,7 +325,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil } else { try { fs = new ArchiveContainer(path); - } catch (ProviderNotFoundException | SecurityException ex) { + } catch (ProviderNotFoundException ex) { throw new IOException(ex); } } @@ -556,7 +554,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil private final FileSystem fileSystem; private final Map packages; - public ArchiveContainer(Path archivePath) throws IOException, ProviderNotFoundException, SecurityException { + public ArchiveContainer(Path archivePath) throws IOException, ProviderNotFoundException { this.archivePath = archivePath; if (multiReleaseValue != null && archivePath.toString().endsWith(".jar")) { Map env = Collections.singletonMap("multi-release", multiReleaseValue); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index d70032353b6..a24184e990b 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, 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 @@ -1760,12 +1760,6 @@ public class ClassWriter extends ClassFile { } long getLastModified(FileObject filename) { - long mod = 0; - try { - mod = filename.getLastModified(); - } catch (SecurityException e) { - throw new AssertionError("CRT: couldn't get source file modification date: " + e.getMessage()); - } - return mod; + return filename.getLastModified(); } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java index 8a8226b3dba..fe972f267df 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java @@ -39,7 +39,6 @@ import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; -import java.util.List; import jdk.internal.misc.MethodFinder; import jdk.internal.misc.VM; @@ -74,7 +73,6 @@ public final class SourceLauncher { public static void main(String... args) throws Throwable { try { new SourceLauncher(System.err) - .checkSecurityManager() .run(VM.getRuntimeArguments(), args); } catch (Fault f) { System.err.println(f.getMessage()); @@ -108,19 +106,6 @@ public final class SourceLauncher { this.out = out; } - /** - * Checks if a security manager is present and throws an exception if so. - * @return this object - * @throws Fault if a security manager is present - */ - @SuppressWarnings("removal") - private SourceLauncher checkSecurityManager() throws Fault { - if (System.getSecurityManager() != null) { - throw new Fault(Errors.SecurityManager); - } - return this; - } - /** * Compiles a source file, and executes the main method it contains. * diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index 1870d487c59..4ea1c488875 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, 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 @@ -30,9 +30,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.file.Path; import java.util.*; import java.util.Map.Entry; import java.util.function.Predicate; @@ -62,7 +59,6 @@ import com.sun.tools.javac.comp.Check; import com.sun.tools.javac.comp.Enter; import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.comp.Modules; -import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.main.JavaCompiler; import com.sun.tools.javac.main.Option; import com.sun.tools.javac.model.JavacElements; @@ -167,7 +163,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea private ClassLoader processorClassLoader; private ServiceLoader serviceLoader; - private SecurityException processorLoaderException; private final JavaFileManager fileManager; @@ -268,28 +263,24 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } private void initProcessorLoader() { - try { - if (fileManager.hasLocation(ANNOTATION_PROCESSOR_MODULE_PATH)) { - try { - serviceLoader = fileManager.getServiceLoader(ANNOTATION_PROCESSOR_MODULE_PATH, Processor.class); - } catch (IOException e) { - throw new Abort(e); - } - } else { - // If processorpath is not explicitly set, use the classpath. - processorClassLoader = fileManager.hasLocation(ANNOTATION_PROCESSOR_PATH) - ? fileManager.getClassLoader(ANNOTATION_PROCESSOR_PATH) - : fileManager.getClassLoader(CLASS_PATH); - - if (options.isSet("accessInternalAPI")) - ModuleHelper.addExports(getClass().getModule(), processorClassLoader.getUnnamedModule()); - - if (processorClassLoader != null && processorClassLoader instanceof Closeable closeable) { - compiler.closeables = compiler.closeables.prepend(closeable); - } + if (fileManager.hasLocation(ANNOTATION_PROCESSOR_MODULE_PATH)) { + try { + serviceLoader = fileManager.getServiceLoader(ANNOTATION_PROCESSOR_MODULE_PATH, Processor.class); + } catch (IOException e) { + throw new Abort(e); + } + } else { + // If processorpath is not explicitly set, use the classpath. + processorClassLoader = fileManager.hasLocation(ANNOTATION_PROCESSOR_PATH) + ? fileManager.getClassLoader(ANNOTATION_PROCESSOR_PATH) + : fileManager.getClassLoader(CLASS_PATH); + + if (options.isSet("accessInternalAPI")) + ModuleHelper.addExports(getClass().getModule(), processorClassLoader.getUnnamedModule()); + + if (processorClassLoader != null && processorClassLoader instanceof Closeable closeable) { + compiler.closeables = compiler.closeables.prepend(closeable); } - } catch (SecurityException e) { - processorLoaderException = e; } } @@ -305,35 +296,24 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } else if (processors != null) { processorIterator = processors.iterator(); } else { - if (processorLoaderException == null) { - /* - * If the "-processor" option is used, search the appropriate - * path for the named class. Otherwise, use a service - * provider mechanism to create the processor iterator. - * - * Note: if an explicit processor path is not set, - * only the class path and _not_ the module path are - * searched for processors. - */ - String processorNames = options.get(Option.PROCESSOR); - if (fileManager.hasLocation(ANNOTATION_PROCESSOR_MODULE_PATH)) { - processorIterator = (processorNames == null) ? - new ServiceIterator(serviceLoader, log) : - new NameServiceIterator(serviceLoader, log, processorNames); - } else if (processorNames != null) { - processorIterator = new NameProcessIterator(processorNames, processorClassLoader, log); - } else { - processorIterator = new ServiceIterator(processorClassLoader, log); - } + /* + * If the "-processor" option is used, search the appropriate + * path for the named class. Otherwise, use a service + * provider mechanism to create the processor iterator. + * + * Note: if an explicit processor path is not set, + * only the class path and _not_ the module path are + * searched for processors. + */ + String processorNames = options.get(Option.PROCESSOR); + if (fileManager.hasLocation(ANNOTATION_PROCESSOR_MODULE_PATH)) { + processorIterator = (processorNames == null) ? + new ServiceIterator(serviceLoader, log) : + new NameServiceIterator(serviceLoader, log, processorNames); + } else if (processorNames != null) { + processorIterator = new NameProcessIterator(processorNames, processorClassLoader, log); } else { - /* - * A security exception will occur if we can't create a classloader. - * Ignore the exception if, with hindsight, we didn't need it anyway - * (i.e. no processor was specified either explicitly, or implicitly, - * in service configuration file.) Otherwise, we cannot continue. - */ - processorIterator = handleServiceLoaderUnavailability("proc.cant.create.loader", - processorLoaderException); + processorIterator = new ServiceIterator(processorClassLoader, log); } } PlatformDescription platformProvider = context.get(PlatformDescription.class); @@ -363,47 +343,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } } - /** - * Returns an empty processor iterator if no processors are on the - * relevant path, otherwise if processors are present, logs an - * error. Called when a service loader is unavailable for some - * reason, either because a service loader class cannot be found - * or because a security policy prevents class loaders from being - * created. - * - * @param key The resource key to use to log an error message - * @param e If non-null, pass this exception to Abort - */ - private Iterator handleServiceLoaderUnavailability(String key, Exception e) { - if (fileManager instanceof JavacFileManager standardFileManager) { - Iterable workingPath = fileManager.hasLocation(ANNOTATION_PROCESSOR_PATH) - ? standardFileManager.getLocationAsPaths(ANNOTATION_PROCESSOR_PATH) - : standardFileManager.getLocationAsPaths(CLASS_PATH); - - if (needClassLoader(options.get(Option.PROCESSOR), workingPath) ) - handleException(key, e); - - } else { - handleException(key, e); - } - - return Collections.emptyIterator(); - } - - /** - * Handle a security exception thrown during initializing the - * Processor iterator. - */ - private void handleException(String key, Exception e) { - if (e != null) { - log.error(key, e.getLocalizedMessage()); - throw new Abort(e); - } else { - log.error(key); - throw new Abort(); - } - } - /** * Use a service loader appropriate for the platform to provide an * iterator over annotations processors; fails if a loader is @@ -417,13 +356,8 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea ServiceIterator(ClassLoader classLoader, Log log) { this.log = log; try { - try { - loader = ServiceLoader.load(Processor.class, classLoader); - this.iterator = loader.iterator(); - } catch (Exception e) { - // Fail softly if a loader is not actually needed. - this.iterator = handleServiceLoaderUnavailability("proc.no.service", null); - } + loader = ServiceLoader.load(Processor.class, classLoader); + this.iterator = loader.iterator(); } catch (Throwable t) { log.error(Errors.ProcServiceProblem); throw new Abort(t); @@ -1548,32 +1482,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea return fo.isNameCompatible("module-info", kind); } - /* - * Called retroactively to determine if a class loader was required, - * after we have failed to create one. - */ - private boolean needClassLoader(String procNames, Iterable workingpath) { - if (procNames != null) - return true; - - URL[] urls = new URL[1]; - for(Path pathElement : workingpath) { - try { - urls[0] = pathElement.toUri().toURL(); - if (ServiceProxy.hasService(Processor.class, urls)) - return true; - } catch (MalformedURLException ex) { - throw new AssertionError(ex); - } - catch (ServiceProxy.ServiceConfigurationError e) { - log.error(Errors.ProcBadConfigFile(e.getLocalizedMessage())); - return true; - } - } - - return false; - } - class ImplicitCompleter implements Completer { private final JCCompilationUnit topLevel; diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/ServiceProxy.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/ServiceProxy.java deleted file mode 100644 index 20324629ef4..00000000000 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/ServiceProxy.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2006, 2022, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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. - */ - -package com.sun.tools.javac.processing; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URL; - -import static java.nio.charset.StandardCharsets.UTF_8; - -/** - * Utility class to determine if a service can be found on the - * path that might be used to create a class loader. - * - *

This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. - * - */ -// based on sun.misc.Service -class ServiceProxy { - static class ServiceConfigurationError extends Error { - static final long serialVersionUID = 7732091036771098303L; - - ServiceConfigurationError(String msg) { - super(msg); - } - } - - private static final String prefix = "META-INF/services/"; - - private static void fail(Class service, String msg) - throws ServiceConfigurationError { - throw new ServiceConfigurationError(service.getName() + ": " + msg); - } - - private static void fail(Class service, URL u, int line, String msg) - throws ServiceConfigurationError { - fail(service, u + ":" + line + ": " + msg); - } - - /** - * Parse the content of the given URL as a provider-configuration file. - * - * @param service - * The service class for which providers are being sought; - * used to construct error detail strings - * - * @param u - * The URL naming the configuration file to be parsed - * - * @return true if the name of a service is found - * - * @throws ServiceConfigurationError - * If an I/O error occurs while reading from the given URL, or - * if a configuration-file format error is detected - */ - private static boolean parse(Class service, URL u) throws ServiceConfigurationError { - InputStream in = null; - BufferedReader r = null; - try { - in = u.openStream(); - r = new BufferedReader(new InputStreamReader(in, UTF_8)); - int lc = 1; - String ln; - while ((ln = r.readLine()) != null) { - int ci = ln.indexOf('#'); - if (ci >= 0) ln = ln.substring(0, ci); - ln = ln.trim(); - int n = ln.length(); - if (n != 0) { - if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0)) - fail(service, u, lc, "Illegal configuration-file syntax"); - int cp = ln.codePointAt(0); - if (!Character.isJavaIdentifierStart(cp)) - fail(service, u, lc, "Illegal provider-class name: " + ln); - for (int i = Character.charCount(cp); i < n; i += Character.charCount(cp)) { - cp = ln.codePointAt(i); - if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) - fail(service, u, lc, "Illegal provider-class name: " + ln); - } - return true; - } - } - } catch (FileNotFoundException x) { - return false; - } catch (IOException x) { - fail(service, ": " + x); - } finally { - try { - if (r != null) r.close(); - } catch (IOException y) { - fail(service, ": " + y); - } - try { - if (in != null) in.close(); - } catch (IOException y) { - fail(service, ": " + y); - } - } - return false; - } - - /** - * Return true if a description for at least one service is found in the - * service configuration files in the given URLs. - */ - public static boolean hasService(Class service, URL[] urls) - throws ServiceConfigurationError { - for (URL url: urls) { - try { - String fullName = prefix + service.getName(); - @SuppressWarnings("deprecation") - URL u = new URL(url, fullName); - boolean found = parse(service, u); - if (found) - return true; - } catch (MalformedURLException e) { - // should not happen; ignore it if it does - } - } - return false; - } -} diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index bd666f3427d..96944f698dd 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1179,9 +1179,6 @@ compiler.misc.user.selected.completion.failure=\ compiler.err.proc.no.explicit.annotation.processing.requested=\ Class names, ''{0}'', are only accepted if annotation processing is explicitly requested -compiler.err.proc.no.service=\ - A ServiceLoader was not usable and is required for annotation processing. - # 0: string, 1: string compiler.err.proc.processor.bad.option.name=\ Bad option name ''{0}'' provided by processor ''{1}'' diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties index 1bf209a7fd6..dddad794427 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties @@ -84,9 +84,6 @@ launcher.error=\ launcher.err.no.args=\ no path for source file -launcher.err.security.manager=\ - cannot use source-code launcher with a security manager enabled - # 0: string launcher.err.invalid.filename=\ invalid path for source file: {0} diff --git a/test/langtools/tools/javac/diags/examples.not-yet.txt b/test/langtools/tools/javac/diags/examples.not-yet.txt index e158366a171..39bcec33654 100644 --- a/test/langtools/tools/javac/diags/examples.not-yet.txt +++ b/test/langtools/tools/javac/diags/examples.not-yet.txt @@ -34,7 +34,6 @@ compiler.err.proc.bad.config.file # JavacProcessingEnviron compiler.err.proc.cant.access # completion failure compiler.err.proc.cant.access.1 # completion failure, no stack trace compiler.err.proc.cant.create.loader # security exception from service loader -compiler.err.proc.no.service # JavacProcessingEnvironment: no service loader available compiler.err.proc.processor.bad.option.name # cannot happen? masked by javac.err.invalid.A.key compiler.err.proc.service.problem # JavacProcessingEnvironment: catch Throwable from service loader compiler.err.proc.cant.load.class # JavacProcessingEnvironment: cant load the class/jar file